這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
go 官方庫的檔案操作分散在多個包中,感覺有點亂,比如
os,
ioutil包,基於別人總結的基礎上簡單總結一下
1.檔案基本操作
1.1建立空檔案
package mainimport ( "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) }}
1.2 truncate 檔案
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) } }
1.3 得到檔案資訊
package mainimport ( "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) }}
運行結果
1.4 重新命名和移動
rename和
move原理一樣
package mainimport ( "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) }}
1.5 刪除檔案
package mainimport ( "log" "os")func main() { err := os.Remove("text.txt") checkErr(err)}func checkErr(err error) { if err != nil { log.Panic(err) }}
1.6 開啟檔案
package mainimport ( "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) }}
1.7檢查檔案是否存在
package mainimport ( "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)}
1.8 檢查讀寫權限
package mainimport ( "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()}
1.9改變許可權、擁有者、時間戳記
package mainimport ( "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) }}
1.10 永久連結和軟連結
一個普通的檔案是一個指向硬碟的inode的地方。
永久連結建立一個新的指標指向同一個地方。只有所有的連結被刪除後檔案才會被刪除。永久連結只在相同的檔案系統中才工作。你可以認為一個永久連結是一個正常的連結。
symbolic link,又叫軟串連,和永久連結有點不一樣,它不直接指向硬碟中的相同的地方,而是通過名字引用其它檔案。他們可以指向不同的檔案系統中的不同檔案。並不是所有的作業系統都支援軟連結。
package mainimport ( "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) }}
文章來源:http://colobu.com/2016/10/12/...