golang標準庫的分析os包(6)

這個仍是在個人博客首發的,可是我感受人流量過小,咱們寫博客的目的不只是記錄咱們再用的時候遇到的問題,是爲了更好的讓你們在之後的學習和開發中也用到~~爲go語言的宣傳盡本身一點微薄的力量
今天咱們講golang標準庫的os包type File struct{},仍是廢話少說直接上代碼html

(1)os.Create()這個函數是創見一個文件,函數的原型是func Create(name string) (file *File, err error)輸入的是名稱字符串類型,返回的是一個File的指針和一個error

import (
    "fmt"
    "os"
    "reflect"
)

func main() {
    f, _ := os.Create("widuu_2.go")
    defer f.Close()
    fmt.Println(reflect.ValueOf(f).Type()) //*os.File
}

這個函數的原理實際上是這樣的OpenFile(name, O_RDWR|O_CREATE|O_TRUNC, 0666) O_RDWR也就是說用讀寫的權限,O_CREATE而後文件存在忽略,不存在建立它,O_TRUNC文件存在截取長度爲0,這就解釋了爲何咱們明明有這個文件,我擦,建立以後哭了~啥都沒有了~~用的時候需謹慎,先判斷文件是否存在~git

(2)os.OpenFile函數的原型是func OpenFile(name string, flag int, perm FileMode) (file *File, err error)要指定文件權限和打開的方式,就是咱們上邊所用到的

import (
    "fmt"
    "os"
)
func main() {
    f, _ := os.OpenFile("10.go", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)
    defer f.Close()
    fmt.Println(f.Stat())
}

這個就是上邊的Create()只不過權限是0777以及下邊的操做等大部分用到OpenFile()github

(3)os.Open()這個函數是打開文件使用的,函數原型是func Open(name string) (file *File, err error),返回值就不說了同樣的,它的其實原理是這樣的OpenFile(name, O_RDONLY, 0)以讀文件的模式打開

import (
    "fmt"
    "os"
    "reflect"
)

func main() {
    f, _ := os.Open("1.go")
    defer f.Close()
}

(4)os.Stat()這個是獲取fileinfo的結構描述func Stat(name string) (fi FileInfo, err error)返回了Fileinfo這個結構,咱們再前邊也詳細講了,其實它是怎麼實現的呢?由於咱們沒講syscall因此咱們就講一個,譬如FileInfo底層獲取fs := &fileStat{name: basename(name)}而後後邊邏輯你們能夠看源代碼

import (
    "fmt"
    "os"
)

func main() {
    f, _ := os.Stat("1.go")
    fmt.Println(f.Size())
}

(5)os.Fd()返回文件的句柄,函數原型是func (file *File) Fd() uintptr函數是這樣的uintptr(file.fd) 返回的是文件的句柄,句柄是什麼?句柄,是整個windows編程的基礎。一個句柄是指使用的一個惟一的整數

import (
    "fmt"
    "os"
)

func main() {
    f, _ := os.Open("1.go")
    fmt.Println(f.Fd()) //個人平臺句柄是228
}

(6)os.Pipe()這個函數獲取的函數的讀寫指針,函數原型func Pipe() (r *File, w *File, err error)

import (
    "fmt"
    "os"
)

func main() {
    r, w, _ := os.Pipe()
    fmt.Println(r, w) //&{0xc08402e120} &{0xc08402e180}
}

(7)os.NewFile()函數原型是func NewFile(fd uintptr, name string) *File 第一個傳入的是句柄,而後是文件名稱,這個函數並非真的建立了一個文件,是新建一個文件不保存,而後返回文件的指針

import (
    "fmt"
    "os"
)

func main() {
    f, _ := os.Open("ini.go")
    defer f.Close()
    f1 := os.NewFile(f.Fd(), "ceshi.go") //輸如ini.go的句柄
    defer f1.Close()
    fd, _ := f1.Stat()
    fmt.Println(fd.ModTime())   //返回的是ini.go的建立時間2013-11-27 09:11:50.2793737 +0800 CST

}

(8)(f *File).Chdir()修改工做目錄,函數原型func (f *File) Chdir() error,這個時候f必須是目錄了,可是吧這個不支持windows

import (
    "fmt"
    "os"
)

func main() {
    dir, _ := os.Getwd()
    fmt.Println(dir)
    f, _ := os.Open("views")
    err := f.Chdir()
    if err != nil {
        fmt.Println(err)
    }
    dir1, _ := os.Getwd()
    fmt.Println(dir1)
}

(9)Chmod(),Chown()都是同樣的,固然你們能夠直接用os.Chmod(),os.Chdir()函數來改變

今天也就到這裏,明天咱們繼續哈~~~golang

博客首發在http://www.widuu.com/archives/01/921.html,你們能夠在個人博客找前5個os包的講解,天天一點了解golang
github的地址:https://github.com/widuu/gopkg編程

相關文章
相關標籤/搜索