go 官方庫的文件操做分散在多個包中,感受有點亂,好比os
,ioutil
包,基於別人總結的基礎上簡單總結一下
package main import ( "os" "log" ) var ( newFile *os.File err error ) func main(){ //建立文件 newFile,err=os.Create("text.txt") checkErr(err) log.Println(newFile) newFile.Close() } /** 檢查錯誤 */ func checkErr(err error){ if err!=nil{ log.Fatal(err) } }
package main import ( "log" "os" ) func main(){ // 裁剪一個文件到100個字節。 // 若是文件原本就少於100個字節,則文件中原始內容得以保留,剩餘的字節以null字節填充。 // 若是文件原本超過100個字節,則超過的字節會被拋棄。 // 這樣咱們老是獲得精確的100個字節的文件。 // 傳入0則會清空文件。 err:=os.Truncate("text.txt",100) checkErr(err) } func checkErr(err error){ if err!=nil{ log.Panic(err) } }
package main import ( "log" "os" "fmt" ) var ( fileInfo os.FileInfo err error ) func main() { fileInfo, err = os.Stat("text.txt") checkErr(err) fmt.Println("FIle name:", fileInfo.Name()) fmt.Println("Size in bytes:", fileInfo.Size()) fmt.Println("Permissions:", fileInfo.Mode()) fmt.Println("Last modified:", fileInfo.ModTime()) fmt.Println("Is directory:", fileInfo.IsDir()) fmt.Printf("System interface type:%T\n", fileInfo.Sys()) fmt.Printf("System info:%+v\n\n", fileInfo.Sys()) } func checkErr(err error) { if err != nil { log.Panic(err) } }
運行結果node
rename
和move
原理同樣
package main import ( "log" "os" ) func main() { oldPath, newPath := "text.txt", "test.txt" err := os.Rename(oldPath, newPath) checkErr(err) } func checkErr(err error) { if err != nil { log.Panic(err) } }
package main import ( "log" "os" ) func main() { err := os.Remove("text.txt") checkErr(err) } func checkErr(err error) { if err != nil { log.Panic(err) } }
package main import ( "log" "os" ) func main() { // 簡單地以只讀的方式打開。下面的例子會介紹讀寫的例子。 file,err:=os.Open("test.txt") checkErr(err) file.Close() // OpenFile提供更多的選項。 // 最後一個參數是權限模式permission mode // 第二個是打開時的屬性 file1,err:=os.OpenFile("hello.txt",os.O_CREATE|os.O_APPEND,0666) checkErr(err) file1.Close() //下面的屬性能夠單獨使用,也能夠組合使用。 // 組合使用時可使用 OR 操做設置 OpenFile的第二個參數,例如: // os.O_CREATE|os.O_APPEND // 或者 os.O_CREATE|os.O_TRUNC|os.O_WRONLY // os.O_RDONLY // 只讀 // os.O_WRONLY // 只寫 // os.O_RDWR // 讀寫 // os.O_APPEND // 往文件中添建(Append) // os.O_CREATE // 若是文件不存在則先建立 // os.O_TRUNC // 文件打開時裁剪文件 // os.O_EXCL // 和O_CREATE一塊兒使用,文件不能存在 // os.O_SYNC // 以同步I/O的方式打開 } func checkErr(err error) { if err != nil { log.Panic(err) } }
package main import ( "log" "os" ) func main() { fileInfo,err:=os.Stat("hello.txt") if err!=nil{ if os.IsNotExist(err){ log.Fatalln("file does not exist") } } log.Println("file does exist. file information:") log.Println(fileInfo) }
package main import ( "os" "log" ) func main() { // 這個例子測試寫權限,若是沒有寫權限則返回error。 // 注意文件不存在也會返回error,須要檢查error的信息來獲取究竟是哪一個錯誤致使。 file, err := os.OpenFile("1.txt", os.O_WRONLY, 0666) if err != nil { if os.IsPermission(err) { log.Println("Error write permission denied") } if os.IsNotExist(err) { log.Println("file does not exist") } } file.Close() // 測試讀權限 file, err = os.OpenFile("test.txt", os.O_RDONLY, 0666) if err != nil { if os.IsPermission(err) { log.Println("Error:Read permission denied") } } file.Close() }
package main import ( "os" "log" "time" "fmt" ) func main(){ // 使用Linux風格改變文件權限 err:=os.Chmod("test.txt",0777) checkErr(err) // 改變文件全部者 err=os.Chown("test.txt",os.Geteuid(),os.Getgid()) checkErr(err) twoDaysFromNow:=time.Now().Add(48*time.Hour) lastAccessTime:=twoDaysFromNow lastModifyTime:=twoDaysFromNow err=os.Chtimes("test.txt",lastAccessTime,lastModifyTime) checkErr(err) fileInfo,err:=os.Stat("test.txt") fmt.Println("file modified time:",fileInfo.ModTime()) } func checkErr(err error){ if err!=nil{ log.Println(err) } }
一個普通的文件是一個指向硬盤的inode的地方。
硬連接建立一個新的指針指向同一個地方。只有全部的連接被刪除後文件纔會被刪除。硬連接只在相同的文件系統中才工做。你能夠認爲一個硬連接是一個正常的連接。symbolic link,又叫軟鏈接,和硬連接有點不同,它不直接指向硬盤中的相同的地方,而是經過名字引用其它文件。他們能夠指向不一樣的文件系統中的不一樣文件。並非全部的操做系統都支持軟連接。測試
package main import ( "os" "log" "fmt" ) func main() { // 建立一個硬連接。 // 建立後同一個文件內容會有兩個文件名,改變一個文件的內容會影響另外一個。 // 刪除和重命名不會影響另外一個。 err := os.Link("original.txt", "original_also.txt") if err != nil { log.Fatal(err) } fmt.Println("creating sym") // Create a symlink err = os.Symlink("original.txt", "original_sym.txt") if err != nil { log.Fatal(err) } // Lstat返回一個文件的信息,可是當文件是一個軟連接時,它返回軟連接的信息,而不是引用的文件的信息。 // Symlink在Windows中不工做。 fileInfo, err := os.Lstat("original_sym.txt") if err != nil { log.Fatal(err) } fmt.Printf("Link info: %+v", fileInfo) //改變軟連接的擁有者不會影響原始文件。 err = os.Lchown("original_sym.txt", os.Getuid(), os.Getgid()) if err != nil { log.Fatal(err) } }