使用os完成檔案操作(常用)
來源:互聯網
上載者:User
需要用golang完成一個寫入檔案的程式,第一次用到os下的這些函數,給自己記個文檔。看源碼的過程中,發現使用golang中的檔案建立等函數,需要瞭解檔案許可權位的知識(ps:Java裡從來就調個方法就解決了,從沒仔細瞭解過),這裡貼一個[講解許可權位](https://blog.csdn.net/devyfong/article/details/8066369)的部落格。我使用的IDE是IntelliJ GoLand,看源碼非常方便,推薦和我一樣的初學者使用### func Getwd() (dir string, err error) {...}獲得程式運行路徑,相當於Linux下運行`pwd`命令```// 代碼package mainimport ("fmt""os")func main() {fmt.Println(os.Getwd())}// 命令列執行bogon:postback zhaoyf$ go run Application.go /Users/zhaoyf/Code/go_path/src/adr-postback-consumer/postback <nil>bogon:postback zhaoyf$ cd ~bogon:~ zhaoyf$ go run Code/go_path/src/adr-postback-consumer/postback/Application.go /Users/zhaoyf <nil>```### func IsNotExist(err error) bool {...}判斷err是否在提示檔案或目錄不存在```// ----- 源碼// error.go -> IsNotExist()func IsNotExist(err error) bool {return isNotExist(err)}// error_unix.go -> isNotExist() // 我的環境是Mac,可能其他系統檔案名稱不同func isNotExist(err error) bool {err = underlyingError(err)// 當代碼看到這一步發現,這個方法是用來比較參數err是不是一個指定的錯誤return err == syscall.ENOENT || err == ErrNotExist}// error.go -> underlyingError() // 返回已知os錯誤類型的底層錯誤func underlyingError(err error) error {switch err := err.(type) {case *PathError:return err.Errcase *LinkError:return err.Errcase *SyscallError:return err.Err}return err}```### func Mkdir(name string, perm FileMode) error {...}根據給定路徑[name]建立檔案夾,並通過perm指定檔案夾的許可權```// 自己封裝的建立檔案夾函數func mkdir(path string) {err := os.Mkdir(path, os.ModeDir)// 當返回error時,且error不是檔案已存在錯誤,列印錯誤資訊if err != nil && os.IsNotExist(err) {fmt.Printf("[init] create log dir[%s] falied :%s\n", path, err)}}```### func OpenFile(name string, flag int, perm FileMode) (*File, error) {...}返回可以執行 I/O 操作的方法,通過操作傳回值的 *File 進行讀寫刪,請注意代碼中流資源的釋放```// 具體常量代碼篇幅太長,請根據如下所示自行尋找// flag 取值 詳見file.go -> 65行常量定義// perm 取值 詳見types.go -> 42行常量定義```### func Create(name string) (*File, error) {...}不解釋,直接看源碼吧```func Create(name string) (*File, error) {// 如果對 O_* 常量不理解,可以看上述 OpenFile() 函數中的 flag 取值return OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666)}```### func (f *File) Write(b []byte) (n int, err error) {...}寫入檔案,返回寫入成功的位元組數```// 偷個懶,樣本直接貼 writeString() 函數的源碼// WriteString is like Write, but writes the contents of string s rather than// a slice of bytes.func (f *File) WriteString(s string) (n int, err error) {return f.Write([]byte(s))}// 自己封裝的寫入文本的函數func write(log string, filePath string) {file, err := os.OpenFile(filePath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)if err != nil && os.IsNotExist(err) {fmt.Printf("[write] create log file[%s] falied :%s\n", filePath, err)}defer file.Close()file.WriteString(log + "\n")}```### os.PathSeparator文末加個小彩蛋,檔案路徑的分隔字元,win用`\\` unix用`/`,為了避免在代碼中寫死造成的 bug,可以用這個常量代替83 次點擊