goLang 檔案操作之一

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
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 重新命名和移動

renamemove原理一樣
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/...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.