匯總檔案的相關操作
來源:互聯網
上載者:User
**我們在進行檔案的相關操作時,往往不明白在哪種情況下使用那些函數,每次查百度導致開發效率低下,我這裡列舉一些方便以後查詢:*** **讀取整個檔案*** **從檔案的某個位置開始,進行讀、寫n個字元操作*** **拷貝檔案到另一個檔案,或拷貝檔案的前面n個字元到另一個檔案*** **將多個檔案匯聚到一個檔案來進行操作*** **將多個字元同時寫到多個檔案中*** **擷取檔案的相關資訊(名稱、大小、是否為檔案夾、檔案許可權、建立、最後訪問、最後修改時間、絕對路徑、重新命名操作、是否存在)*** **擷取檔案夾的所有檔案*** **將一個檔案的內容寫入到另一個檔案中,可控制寫入內容****1、讀取整個檔案**```gofunc test1() {f, err := os.Open("d:/a.txt")if err != nil {panic(err)}defer f.Close()// 讀取整個檔案1. 使用stat擷取檔案長度,再開闢空間,將資料寫到變數中,輸出到終端fi, err := f.Stat()if err != nil {panic(err)}b := make([]byte, fi.Size())if _, err = f.Read(b); err != nil {panic(err)}os.Stdout.Write(b)// 讀取整個檔案2. 直接使用ioutil的ReadAll函數b, err = ioutil.ReadAll(f)if err != nil {panic(err)}os.Stdout.Write(b)}```**2、從檔案的某個位置開始,進行讀、寫n個字元操作**```gofunc test2() {f, err := os.OpenFile("d:/a.txt", os.O_RDWR, 0755)if err != nil {panic(err)}defer f.Close()// 設定作業檔案的當前位置為倒數第10個字元if _, err := f.Seek(-10, io.SeekEnd); err != nil {panic(err)}// 從當前位置讀取5個字元b := make([]byte, 10)if _, err := f.ReadAt(b, 5); err != nil {panic(err)}os.Stdout.Write(b)// 從當前位置寫5個字元(相當於覆蓋檔案的最後5個字元)f.WriteAt(b, 5)}```**3、拷貝檔案到另一個檔案,或拷貝檔案的前面n個字元到另一個檔案**```gofunc test3() {f1, err := os.Open("d:/a.txt")if err != nil {panic(err)}defer f1.Close()f2, err := os.OpenFile("d:/b.txt", os.O_CREATE | os.O_RDWR, 0755)if err != nil {panic(err)}defer f2.Close()// 拷貝f1的所有字元到f2的前面,如果f2的size比f1大,那麼後面的字元依然保留// 如果要在f2進行追加,使用os.O_APPENDif _, err := io.Copy(f2, f1); err != nil {panic(err)}// 拷貝f1的n個字元到f2的前面if _, err := io.CopyN(f2, f1, 10); err != nil {panic(err)}}```**4、 將多個檔案匯聚到一個檔案來進行操作**```gofunc test4() {f1, err := os.Open("d:/a.txt")if err != nil {panic(err)}defer f1.Close()f2, err := os.Open("d:/b.txt")if err != nil {panic(err)}defer f2.Close()// 將2個file.Reade合并成一個Readerr := io.MultiReader(f1, f2)// 輪詢讀取reader中的資料buf := make([]byte, 10)data := make([]byte, 0, 128)for n, err := r.Read(buf); err != io.EOF; n, err = r.Read(buf) {if err != nil {panic(err)}data = append(data, buf[:n]...)}os.Stdout.Write(data)}```**5、將多個字元同時寫到多個檔案中**```gofunc test5() {f, err := os.OpenFile("d:/a.txt", os.O_CREATE | os.O_RDWR | os.O_APPEND, 0755)if err != nil {panic(err)}defer f.Close()// 將file和標準輸出合并到一個writer中w := io.MultiWriter(f, os.Stdout)// 每次write都會寫到w包含的所有writer中w.Write([]byte("helloworld"))w.Write([]byte("nihaoshijie"))}```**6、擷取檔案的相關資訊(名稱、大小、是否為檔案夾、檔案許可權、建立、最後訪問、最後修改時間、絕對路徑、重新命名操作、是否存在)**```gofunc test6() {f, err := os.OpenFile("d:/a.txt", os.O_CREATE|os.O_RDWR, 0755)if err != nil {panic(err)}defer f.Close()fi, err := f.Stat()if err != nil {panic(err)}// 名稱、大小、是否為檔案夾、詳細資料、檔案許可權、最後修改時間fmt.Printf("name: %s\n", fi.Name())fmt.Printf("size: %d\n", fi.Size())fmt.Printf("isDir: %t\n", fi.IsDir())fmt.Printf("sys: %v\n", fi.Sys())fmt.Printf("mode: %o\n", fi.Mode())fmt.Printf("modTime: %s\n", fi.ModTime())// 擷取詳細資料中的檔案建立時間,具體詳細資料見Stat_t結構體(windows和linux不同)//windows// CreatetionTimeuint32//LastAccessTimeuint32if reflect.ValueOf(fi.Sys()).Elem().FieldByName("CreatetionTime").IsValid() {ctim := reflect.ValueOf(fi.Sys()).Elem().FieldByName("CreatetionTime").Field(0).Uint()fmt.Printf("ctim: %d\n", ctim)}// 擷取檔案的絕對路徑dir, err := filepath.Abs("d:/a.txt")if err != nil {panic(err)}fmt.Printf("dir: %s\n", dir)// 判斷檔案是否不存在if _, err := os.Stat("d:/c.txt"); err != nil {if os.IsNotExist(err) {fmt.Println("file not exist")} else {panic(err)}}// 重新命名檔案或檔案夾(要有許可權/檔案已關閉)if err := os.Rename("d:/b.txt", "d:/d.txt"); err != nil {panic(err)}}```**7、擷取檔案夾的所有檔案**```gofunc test7() {files, err := ioutil.ReadDir("d:/")if err != nil {panic(err)}// 擷取檔案夾下所有檔案和檔案夾的相關資訊for _, f := range files {fmt.Printf("name: %s, size: %d, isDir: %t\n", f.Name(), f.Size(), f.IsDir())}}```**8、將一個檔案的內容寫入到另一個檔案中,可控制寫入內容**```gofunc test8() {f1, err := os.Open("d:/a.txt")if err != nil {panic(err)}defer f1.Close()f2, err := os.OpenFile("d:/b.txt", os.O_CREATE | os.O_RDWR | os.O_APPEND, 0755)if err != nil {panic(err)}defer f2.Close()// 設定將從f1中讀到的寫到f2中r := io.TeeReader(f1, f2)// 迴圈5次讀取f1前面100個字元,每次讀取後會自動寫到f2中for i := 0; i < 5; i++ {f1.Seek(0, io.SeekStart)if _, err := r.Read(make([]byte, 100)); err != nil {if err == io.EOF{return}panic(err)}time.Sleep(time.Second)}}```案例來源於: 《go語言標準庫》https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter01/01.1.html64 次點擊