goLang 文件操做之一

go 官方庫的文件操做分散在多個包中,感受有點亂,好比 os, ioutil包,基於別人總結的基礎上簡單總結一下

1.文件基本操做

1.1建立空文件

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)
      }
}

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 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

clipboard.png

1.4 重命名和移動

renamemove原理同樣
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)
    }
}

1.5 刪除文件

package main

import (
    "log"
    "os"
)

func main() {
    err := os.Remove("text.txt")
    checkErr(err)

}

func checkErr(err error) {
    if err != nil {
        log.Panic(err)
    }
}

1.6 打開文件

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)
    }
}

1.7檢查文件是否存在

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)


}

1.8 檢查讀寫權限

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()
}

1.9改變權限、擁有者、時間戳

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)
    }
}

1.10 硬連接和軟連接

一個普通的文件是一個指向硬盤的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)
    }
}

文章來源:http://colobu.com/2016/10/12/...ui

相關文章
相關標籤/搜索