加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959 文件讀取 os.File 封裝了文件相關操作 type File File代表一個打開的文件對象。 func Create(name string) (file *File, err error) Create採用 ...
加 Golang學習 QQ群共同學習進步成家立業工作 ^-^ 群號:96933959
文件讀取
os.File 封裝了文件相關操作
type File File代表一個打開的文件對象。 func Create(name string) (file *File, err error) Create採用模式0666(任何人都可讀寫,不可執行)創建一個名為name的文件,如果文件已存在會截斷它(為空文件)。如果成功,返回的文件對象可用於I/O;對應的文件描述符具有O_RDWR模式。如果出錯,錯誤底層類型是*PathError。 func Open(name string) (file *File, err error) Open打開一個文件用於讀取。如果操作成功,返回的文件對象的方法可用於讀取數據;對應的文件描述符具有O_RDONLY模式。如果出錯,錯誤底層類型是*PathError。 func OpenFile(name string, flag int, perm FileMode) (file *File, err error) OpenFile是一個更一般性的文件打開函數,大多數調用者都應用Open或Create代替本函數。它會使用指定的選項(如O_RDONLY等)、指定的模式(如0666等)打開指定名稱的文件。如果操作成功,返回的文件對象可用於I/O。如果出錯,錯誤底層類型是*PathError。 func NewFile(fd uintptr, name string) *File NewFile使用給出的Unix文件描述符和名稱創建一個文件。 func Pipe() (r *File, w *File, err error) Pipe返回一對關聯的文件對象。從r的讀取將返回寫入w的數據。本函數會返回兩個文件對象和可能的錯誤。 func (f *File) Name() string Name方法返回(提供給Open/Create等方法的)文件名稱。 func (f *File) Stat() (fi FileInfo, err error) Stat返回描述文件f的FileInfo類型值。如果出錯,錯誤底層類型是*PathError。 func (f *File) Fd() uintptr Fd返回與文件f對應的整數類型的Unix文件描述符。 func (f *File) Chdir() error Chdir將當前工作目錄修改為f,f必須是一個目錄。如果出錯,錯誤底層類型是*PathError。 func (f *File) Chmod(mode FileMode) error Chmod修改文件的模式。如果出錯,錯誤底層類型是*PathError。 func (f *File) Chown(uid, gid int) error Chown修改文件的用戶ID和組ID。如果出錯,錯誤底層類型是*PathError。 func (f *File) Readdir(n int) (fi []FileInfo, err error) Readdir讀取目錄f的內容,返回一個有n個成員的[]FileInfo,這些FileInfo是被Lstat返回的,採用目錄順序。對本函數的下一次調用會返回上一次調用剩餘未讀取的內容的信息。 如果n>0,Readdir函數會返回一個最多n個成員的切片。這時,如果Readdir返回一個空切片,它會返回一個非nil的錯誤說明原因。如果到達了目錄f的結尾,返回值err會是io.EOF。 如果n<=0,Readdir函數返回目錄中剩餘所有文件對象的FileInfo構成的切片。此時,如果Readdir調用成功(讀取所有內容直到結尾),它會返回該切片和nil的錯誤值。如果在到達結尾前遇到錯誤,會返回之前成功讀取的FileInfo構成的切片和該錯誤。 func (f *File) Readdirnames(n int) (names []string, err error) Readdir讀取目錄f的內容,返回一個有n個成員的[]string,切片成員為目錄中文件對象的名字,採用目錄順序。對本函數的下一次調用會返回上一次調用剩餘未讀取的內容的信息。 如果n>0,Readdir函數會返回一個最多n個成員的切片。這時,如果Readdir返回一個空切片,它會返回一個非nil的錯誤說明原因。如果到達了目錄f的結尾,返回值err會是io.EOF。 如果n<=0,Readdir函數返回目錄中剩餘所有文件對象的名字構成的切片。此時,如果Readdir調用成功(讀取所有內容直到結尾),它會返回該切片和nil的錯誤值。如果在到達結尾前遇到錯誤,會返回之前成功讀取的名字構成的切片和該錯誤。 func (f *File) Truncate(size int64) error Truncate改變文件的大小,它不會改變I/O的當前位置。 如果截斷文件,多出的部分就會被丟棄。如果出錯,錯誤底層類型是*PathError。 func (f *File) Read(b []byte) (n int, err error) Read方法從f中讀取最多len(b)位元組數據並寫入b。它返回讀取的位元組數和可能遇到的任何錯誤。文件終止標誌是讀取0個位元組且返回值err為io.EOF。 func (f *File) ReadAt(b []byte, off int64) (n int, err error) ReadAt從指定的位置(相對於文件開始位置)讀取len(b)位元組數據並寫入b。它返回讀取的位元組數和可能遇到的任何錯誤。當n<len(b)時,本方法總是會返回錯誤;如果是因為到達文件結尾,返回值err會是io.EOF。 func (f *File) Write(b []byte) (n int, err error) Write向文件中寫入len(b)位元組數據。它返回寫入的位元組數和可能遇到的任何錯誤。如果返回值n!=len(b),本方法會返回一個非nil的錯誤。 func (f *File) WriteString(s string) (ret int, err error) WriteString類似Write,但接受一個字元串參數。 func (f *File) WriteAt(b []byte, off int64) (n int, err error) WriteAt在指定的位置(相對於文件開始位置)寫入len(b)位元組數據。它返回寫入的位元組數和可能遇到的任何錯誤。如果返回值n!=len(b),本方法會返回一個非nil的錯誤。 func (f *File) Seek(offset int64, whence int) (ret int64, err error) Seek設置下一次讀/寫的位置。offset為相對偏移量,而whence決定相對位置:0為相對文件開頭,1為相對當前位置,2為相對文件結尾。它返回新的偏移量(相對開頭)和可能的錯誤。 func (f *File) Sync() (err error) Sync遞交文件的當前內容進行穩定的存儲。一般來說,這表示將文件系統的最近寫入的數據在記憶體中的拷貝刷新到硬碟中穩定保存。 func (f *File) Close() error Close關閉文件f,使文件不能用於讀寫。它返回可能出現的錯誤。os.File Pkg Doc
讀寫參數
文件打開模式:
const ( O_RDONLY int = syscall.O_RDONLY // 只讀模式打開文件 O_WRONLY int = syscall.O_WRONLY // 只寫模式打開文件 O_RDWR int = syscall.O_RDWR // 讀寫模式打開文件 O_APPEND int = syscall.O_APPEND // 寫操作時將數據附加到文件尾部 O_CREATE int = syscall.O_CREAT // 如果不存在將創建一個新文件 O_EXCL int = syscall.O_EXCL // 和O_CREATE配合使用,文件必須不存在 O_SYNC int = syscall.O_SYNC // 打開文件用於同步I/O O_TRUNC int = syscall.O_TRUNC // 如果可能,打開時清空文件 )
許可權控制:
r ——> 004 w ——> 002 x ——> 001
讀取慄子
os.Open || os.OpenFile
package main import ( "bufio" "fmt" "os" ) func main() { // file, err := os.Open("/tmp/test") file, err := os.OpenFile("/tmp/test", os.O_CREATE|os.O_WRONLY, 0666) if err != nil { fmt.Println("Open file error: ", err) return } defer file.Close() //關閉文件 reader := bufio.NewReader(file) //帶緩衝區的讀寫 for { str, err := reader.ReadString('\n') // 迴圈讀取一行 if err != nil { fmt.Println("read string failed, err: ", err) return } fmt.Println("read string is %s: ", str) } }
readline
package main import ( "bufio" "fmt" "io" "os" ) func main() { file, err := os.Open("C:/test.log") if err != nil { fmt.Println(err) return } defer file.Close() reader := bufio.NewReader(file) var line []byte for { data, prefix, err := reader.ReadLine() if err == io.EOF { break } line = append(line, data...) if !prefix { fmt.Printf("data:%s\n", string(line)) line = line[:] } } }
讀取整個文件慄子
"io/ioutil" 包實現了讀取整個文件功能
package main import ( "fmt" "os" "io/ioutil" ) func main() { fileName := "/tmp/test" file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0666) if err != nil { fmt.Println("Open file error: ", err) return } defer file.Close() buf, err := ioutil.ReadAll(file) //buf, err := ioutil.ReadFile(fileName) if err != nil { fmt.Fprintf(os.Stderr, "File Error: %s\n", err) return } fmt.Printf("%s\n", string(buf)) }
讀取壓縮文件慄子
"compress/*" 包實現壓縮文件功能。
"compress/gzip" 包實現了gzip格式壓縮文件的讀寫
package main import ( "bufio" "compress/gzip" "fmt" "os" ) func main() { fileName := "/tmp/test.log.gz" var r *bufio.Reader fi, err := os.Open(fileName) if err != nil { fmt.Println("error", err) os.Exit(1) } fz, err := gzip.NewReader(fi) if err != nil { fmt.Println("error", err) return } r = bufio.NewReader(fz) for { line, err := r.ReadString('\n') if err != nil { fmt.Println("Done reading file") return } fmt.Println(line) } }
文件寫入
file.WriteString || file.Write
package main import ( "fmt" "os" ) func main() { fileName := "/tmp/test_write" file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755) if err != nil { fmt.Println("error", err) os.Exit(1) } defer file.Close() fileString := "Today very happy." file.Seek(0, 2) // 最後增加 file.WriteString(fileString) //file.Write([]byte(fileString)) }
bufio.Writer.WriteString
帶緩衝的寫,最後要將緩衝中的數據寫入下層的io.Writer介面(Flush方法)
package main import ( "bufio" "fmt" "os" ) func main() { fileName := "/tmp/test_write" file, err := os.OpenFile(fileName, os.O_CREATE|os.O_WRONLY, 0755) if err != nil { fmt.Println("error", err) os.Exit(1) } defer file.Close() fileWrite := bufio.NewWriter(file) fileString := "good.\n" for i := 0; i < 10; i++ { fileWrite.WriteString(fileString) } fileWrite.Flush() }
拷貝文件慄子
從一個文件拷貝到另一個文件
package main import ( "fmt" "io" "os" ) func CopyFile(dstName, srcName string) (writeen int64, err error) { src, err := os.Open(dstName) if err != nil { fmt.Println(err) return } defer src.Close() dst, err := os.OpenFile(srcName, os.O_CREATE|os.O_WRONLY, 0644) if err != nil { fmt.Println(err) return } defer dst.Close() return io.Copy(dst, src) } func main() { CopyFile("/tmp/test", "/tmp/test_copy1") fmt.Println("copy done.") }
慄子
判斷文件或文件夾是否存在
func PathExists(path string) (bool, error) { /* 判斷文件或文件夾是否存在 如果返回的錯誤為nil,說明文件或文件夾存在 如果返回的錯誤類型使用os.IsNotExist()判斷為true,說明文件或文件夾不存在 如果返回的錯誤為其它類型,則不確定是否在存在 */ _, err := os.Stat(path) if err == nil { return true, nil } if os.IsNotExist(err) { return false, nil } return false, err }