os包提供了操做系統函數的不依賴平臺的接口。設計爲Unix風格的,雖然錯誤處理是go風格的;失敗的調用會返回錯誤值而非錯誤碼。一般錯誤值裏包含更多信息。os包的接口規定爲在全部操做系統中都是一致的。非公用的屬性能夠從操做系統特定的syscall包獲取。linux
官方連接:https://studygolang.com/pkgdocgit
=============== 函數部分 =====================github
func Hostname() (name string, err error)
Hostname返回內核提供的主機名。golang
func Getpagesize() int
Getpagesize返回底層的系統內存頁的尺寸。編程
func Environ() []string
Environ返回表示環境變量的格式爲"key=value"的字符串的切片拷貝。windows
func Getenv(key string) string
Getenv檢索並返回名爲key的環境變量的值。若是不存在該環境變量會返回空字符串。安全
func Setenv(key, value string) error
Setenv設置名爲key的環境變量。若是出錯會返回該錯誤。app
func Clearenv()
Clearenv刪除全部環境變量。less
func Exit(code int)
Exit讓當前程序以給出的狀態碼code退出。通常來講,狀態碼0表示成功,非0表示出錯。程序會馬上終止,defer的函數不會被執行。socket
func Expand(s string, mapping func(string) string) string
Expand函數替換s中的${var}或$var爲mapping(var)。例如,os.ExpandEnv(s)等價於os.Expand(s, os.Getenv)。
import os import fmt mapping := func(s string) string { m := map[string]string{"name": "xiaozhang", "age":"18"} return m[s] } data := "hello $name, you age is $age" fmt.Printf("%s", os.Expand(data, mapping)) //輸出hello xiaozhang, you age is 18
func ExpandEnv(s string) string
ExpandEnv函數替換s中的${var}或$var爲名爲var 的環境變量的值。引用未定義環境變量會被替換爲空字符串。
import os path := "GOBIN PATH $APPDATA" fmt.Println(os.ExpandEnv(path)) //輸出GOBIN PATH C:\Users\sunailong\AppData\Roaming
func Getuid() int
Getuid返回調用者的用戶ID。
func Geteuid() int
Geteuid返回調用者的有效用戶ID。
func Getgid() int
Getgid返回調用者的組ID。
func Getegid() int
Getegid返回調用者的有效組ID。
func Getgroups() ([]int, error)
Getgroups返回調用者所屬的全部用戶組的組ID。
//go version:1.9, windows platform import os fmt.Println(os.ExpandEnv(path)) fmt.Println(os.Getuid()) fmt.Println(os.Geteuid()) fmt.Println(os.Getgid()) fmt.Println(os.Getgroups()) 輸出: -1 //若是是unix平臺返回 0 -1 //若是是unix平臺返回 0 -1 //若是是unix平臺返回 0 [] getgroups: not supported by windows
func Getpid() int
Getpid返回調用者所在進程的進程ID。
func Getppid() int
Getppid返回調用者所在進程的父進程的進程ID。
func IsPathSeparator(c uint8) bool
IsPathSeparator返回字符c是不是一個路徑分隔符。
fmt.Println(os.IsPathSeparator('/')) //true fmt.Println(os.IsPathSeparator('|')) //false
func Getwd() (dir string, err error)
Getwd返回一個對應當前工做目錄的根路徑。若是當前目錄能夠通過多條路徑抵達(由於硬連接),Getwd會返回其中一個。
func Chdir(dir string) error
Chdir將當前工做目錄修改成dir指定的目錄。若是出錯,會返回*PathError底層類型的錯誤。
fmt.Println(os.Getwd()) os.Chdir("C:/") fmt.Println(os.Getwd()) 輸出 // E:\projects\GoProjects\gopl.io <nil> // C:\ <nil>
func Chmod(name string, mode FileMode) error
Chmod修改name指定的文件對象的mode。若是name指定的文件是一個符號連接,它會修改該連接的目的地文件的mode。若是出錯,會返回*PathError底層類型的錯誤。
windows 不行
func Chown(name string, uid, gid int) error
Chmod修改name指定的文件對象的用戶id和組id。若是name指定的文件是一個符號連接,它會修改該連接的目的地文件的用戶id和組id。若是出錯,會返回*PathError底層類型的錯誤。uid/gid爲數字
func Lchown(name string, uid, gid int) error
Chmod修改name指定的文件對象的用戶id和組id。若是name指定的文件是一個符號連接,它會修改該符號連接自身的用戶id和組id。若是出錯,會返回*PathError底層類型的錯誤。
func Chtimes(name string, atime time.Time, mtime time.Time) error
Chtimes修改name指定的文件對象的訪問時間和修改時間,相似Unix的utime()或utimes()函數。底層的文件系統可能會截斷/舍入時間單位到更低的精確度。若是出錯,會返回*PathError底層類型的錯誤。
func Mkdir(name string, perm FileMode) error
Mkdir使用指定的權限和名稱建立一個目錄。若是出錯,會返回*PathError底層類型的錯誤。
func MkdirAll(path string, perm FileMode) error
MkdirAll使用指定的權限和名稱建立一個目錄,包括任何須要的上級目錄,並返回nil,不然返回錯誤。權限位perm會應用在每個被本函數建立的目錄上。若是path指定了一個已經存在的目錄,MkdirAll不作任何操做並返回nil。
func Rename(oldpath, newpath string) error
Rename修改一個文件的名字,移動一個文件。可能會有一些個操做系統特定的限制。
func Truncate(name string, size int64) error
Truncate修改name指定的文件的大小。若是該文件爲一個符號連接,將修改連接指向的文件的大小。若是出錯,會返回*PathError底層類型的錯誤。
func Remove(name string) error
Remove刪除name指定的文件或目錄。若是出錯,會返回*PathError底層類型的錯誤。
func RemoveAll(path string) error
RemoveAll刪除path指定的文件,或目錄及它包含的任何下級對象。它會嘗試刪除全部東西,除非遇到錯誤並返回。若是path指定的對象不存在,RemoveAll會返回nil而不返回錯誤。
func Readlink(name string) (string, error)
Readlink獲取name指定的符號連接文件指向的文件的路徑。若是出錯,會返回*PathError底層類型的錯誤。
func Symlink(oldname, newname string) error
Symlink建立一個名爲newname指向oldname的符號連接。若是出錯,會返回* LinkError底層類型的錯誤。
func Link(oldname, newname string) error
Link建立一個名爲newname指向oldname的硬連接。若是出錯,會返回* LinkError底層類型的錯誤。
func SameFile(fi1, fi2 FileInfo) bool
SameFile返回fi1和fi2是否在描述同一個文件。例如,在Unix這表示兩者底層結構的設備和索引節點是相同的;在其餘系統中多是根據路徑名肯定的。SameFile應只使用本包Stat函數返回的FileInfo類型值爲參數,其餘狀況下,它會返回假。
====================Error=============================
func IsExist(err error) bool
返回一個布爾值說明該錯誤是否表示一個文件或目錄已經存在。ErrExist和一些系統調用錯誤會使它返回真。
func IsNotExist(err error) bool
返回一個布爾值說明該錯誤是否表示一個文件或目錄不存在。ErrNotExist和一些系統調用錯誤會使它返回真。
func IsPermission(err error) bool
返回一個布爾值說明該錯誤是否表示因權限不足要求被拒絕。ErrPermission和一些系統調用錯誤會使它返回真。
這三個函數基於error,就是要根據相關操做的error返回再判斷是不是由於這三個緣由致使的錯誤。
=======================Interface============================
type FileInfo interface {
Name() string // 文件的名字(不含擴展名) Size() int64 // 普通文件返回值表示其大小;其餘文件的返回值含義各系統不一樣 Mode() FileMode // 文件的模式位 ModTime() time.Time // 文件的修改時間 IsDir() bool // 等價於Mode().IsDir() Sys() interface{} // 底層數據來源(能夠返回nil) }
func Stat(name string) (fi FileInfo, err error)
Stat返回一個描述name指定的文件對象的FileInfo。若是指定的文件對象是一個符號連接,返回的FileInfo描述該符號連接指向的文件的信息,本函數會嘗試跳轉該連接。若是出錯,返回的錯誤值爲*PathError類型。
func Lstat(name string) (fi FileInfo, err error)
Lstat返回一個描述name指定的文件對象的FileInfo。若是指定的文件對象是一個符號連接,返回的FileInfo描述該符號連接的信息,本函數不會試圖跳轉該連接。若是出錯,返回的錯誤值爲*PathError類型。
FileInfo用來描述一個文件對象。
fi, err3 := os.Stat(file) if err3 != nil { fmt.Println(err) }else { fmt.Println(fi) fileinfo := fi fname := fileinfo.Name() size := fileinfo.Size() mode := fileinfo.Mode() modtime := fileinfo.ModTime() dir := fileinfo.IsDir() fmt.Println(fname , size, mode, modtime, dir) } 輸出: &{test.txt {32 {3933573732 30617868} {3933573732 30617868} {1088149345 30617869} 0 130} 0 {0 0} E:/projects/GoProjects/gopl.io/exercise/lesson01/test.txt 0 0 0 false} test.txt 130 -rw-rw-rw- 2017-09-19 14:05:11.6361569 +0800 CST false
type FileMode uint32
FileMode表明文件的模式和權限位。這些字位在全部的操做系統都有相同的含義,所以文件的信息能夠在不一樣的操做系統之間安全的移植。不是全部的位都能用於全部的系統,惟一共有的是用於表示目錄的ModeDir位。
const ( // 單字符是被String方法用於格式化的屬性縮寫。 ModeDir FileMode = 1 << (32 - 1 - iota) // d: 目錄 ModeAppend // a: 只能寫入,且只能寫入到末尾 ModeExclusive // l: 用於執行 ModeTemporary // T: 臨時文件(非備份文件) ModeSymlink // L: 符號連接(不是快捷方式文件) ModeDevice // D: 設備 ModeNamedPipe // p: 命名管道(FIFO) ModeSocket // S: Unix域socket ModeSetuid // u: 表示文件具備其建立者用戶id權限 ModeSetgid // g: 表示文件具備其建立者組id的權限 ModeCharDevice // c: 字符設備,需已設置ModeDevice ModeSticky // t: 只有root/建立者能刪除/移動文件 // 覆蓋全部類型位(用於經過&獲取類型位),對普通文件,全部這些位都不該被設置 ModeType = ModeDir | ModeSymlink | ModeNamedPipe | ModeSocket | ModeDevice ModePerm FileMode = 0777 // 覆蓋全部Unix權限位(用於經過&獲取類型位) )
這些被定義的位是FileMode最重要的位。另外9個不重要的位爲標準Unix rwxrwxrwx權限(任何人均可讀、寫、運行)。這些(重要)位的值應被視爲公共API的一部分,可能會用於線路協議或硬盤標識:它們不能被修改,但能夠添加新的位。
func (m FileMode) IsDir() bool
IsDir報告m是不是一個目錄。
func (m FileMode) IsRegular() bool
IsRegular報告m是不是一個普通文件。
func (m FileMode) Perm() FileMode
Perm方法返回m的Unix權限位。
func (m FileMode) String() string
fmt.Println(fileinfo.Mode().IsDir())
fmt.Println(fileinfo.Mode().IsRegular())
fmt.Println(fileinfo.Mode().Perm())
fmt.Println(fileinfo.Mode().String())
輸出爲: false
true
-rw-rw-rw-
-rw-rw-rw-
===================== STRUCT : File================================
type File struct {
// 內含隱藏或非導出字段
}
File表明一個打開的文件對象。
func Create(name string) (file *File, err error)
Create採用模式0666(任何人均可讀寫,不可執行)建立一個名爲name的文件,若是文件已存在會截斷它(爲空文件)。若是成功,返回的文件對象可用於I/O;對應的文件描述符具備O_RDWR模式。若是出錯,錯誤底層類型是*PathError。
func Open(name string) (file *File, err error)
Open打開一個文件用於讀取。若是操做成功,返回的文件對象的方法可用於讀取數據;對應的文件描述符具備O_RDONLY模式。若是出錯,錯誤底層類型是*PathError。
func OpenFile(name string, flag int, perm FileMode) (file *File, err error)
OpenFile是一個更通常性的文件打開函數,大多數調用者都應用Open或Create代替本函數。它會使用指定的選項(如O_RDONLY等)、指定的模式(如0666等)打開指定名稱的文件。若是操做成功,返回的文件對象可用於I/O。若是出錯,錯誤底層類型是*PathError。
func NewFile(fd uintptr, name string) *File
NewFile使用給出的Unix文件描述符和名稱建立一個文件。
func (f *File) Fd() uintptr
Fd返回與文件f對應的整數類型的Unix文件描述符。
func Pipe() (r *File, w *File, err error)
Pipe返回一對關聯的文件對象。從r的讀取將返回寫入w的數據。本函數會返回兩個文件對象和可能的錯誤。
func (f *File) Read(b []byte) (n int, err error)
Read方法從f中讀取最多len(b)字節數據並寫入b。它返回讀取的字節數和可能遇到的任何錯誤。文件終止標誌是讀取0個字節且返回值err爲io.EOF。
func (f *File) ReadAt(b []byte, off int64) (n int, err error)
ReadAt從指定的位置(相對於文件開始位置)讀取len(b)字節數據並寫入b。它返回讀取的字節數和可能遇到的任何錯誤。當n<len(b)時,本方法老是會返回錯誤;若是是由於到達文件結尾,返回值err會是io.EOF。
func (f *File) Write(b []byte) (n int, err error)
Write向文件中寫入len(b)字節數據。它返回寫入的字節數和可能遇到的任何錯誤。若是返回值n!=len(b)即返回寫入的長度,本方法會返回一個非nil的錯誤。
func (f *File) WriteString(s string) (ret int, err error)
WriteString相似Write,但接受一個字符串參數。
func (f *File) WriteAt(b []byte, off int64) (n int, err error)
WriteAt在指定的位置(相對於文件開始位置)寫入len(b)字節數據。它返回寫入的字節數和可能遇到的任何錯誤。若是返回值n!=len(b),本方法會返回一個非nil的錯誤。
func (f *File) Name() string
Name方法返回(提供給Open/Create等方法的)文件名稱。
func (f *File) Stat() (fi FileInfo, err error)
Stat返回描述文件f的FileInfo類型值。若是出錯,錯誤底層類型是*PathError。
func (f *File) Fd() uintptr
Fd返回與文件f對應的整數類型的Unix文件描述符。
func (f *File) Chdir() error
Chdir將當前工做目錄修改成f,f必須是一個目錄。若是出錯,錯誤底層類型是*PathError。
func (f *File) Chmod(mode FileMode) error
Chmod修改文件的模式。若是出錯,錯誤底層類型是*PathError。
func (f *File) Chown(uid, gid int) error
Chown修改文件的用戶ID和組ID。若是出錯,錯誤底層類型是*PathError。
func (f *File) Readdir(n int) (fi []FileInfo, err error)
Readdir讀取目錄f的內容,返回一個有n個成員的[]FileInfo,這些FileInfo是被Lstat返回的,採用目錄順序。對本函數的下一次調用會返回上一次調用剩餘未讀取的內容的信息。
若是n>0,Readdir函數會返回一個最多n個成員的切片。這時,若是Readdir返回一個空切片,它會返回一個非nil的錯誤說明緣由。若是到達了目錄f的結尾,返回值err會是io.EOF。
若是n<=0,Readdir函數返回目錄中剩餘全部文件對象的FileInfo構成的切片。此時,若是Readdir調用成功(讀取全部內容直到結尾),它會返回該切片和nil的錯誤值。若是在到達結尾前遇到錯誤,會返回以前成功讀取的FileInfo構成的切片和該錯誤。
package main import ( "os" "fmt" "log" ) func main(){ fd, err := os.Open(".") if err != nil{ log.Fatal(err) }else { dirs, err2 := fd.Readdir(-1) if err2 != nil{ log.Fatal(err2) }else { fmt.Println(dirs) for i:=0; i<len(dirs);i++{ fmt.Println(dirs[i].Name()) } } } }
輸出結果爲當前目錄下全部文件和文件夾
func (f *File) Readdirnames(n int) (names []string, err error)
直接返回名字
Readdir讀取目錄f的內容,返回一個有n個成員的[]string,切片成員爲目錄中文件對象的名字,採用目錄順序。對本函數的下一次調用會返回上一次調用剩餘未讀取的內容的信息。
若是n>0,Readdir函數會返回一個最多n個成員的切片。這時,若是Readdir返回一個空切片,它會返回一個非nil的錯誤說明緣由。若是到達了目錄f的結尾,返回值err會是io.EOF。
若是n<=0,Readdir函數返回目錄中剩餘全部文件對象的名字構成的切片。此時,若是Readdir調用成功(讀取全部內容直到結尾),它會返回該切片和nil的錯誤值。若是在到達結尾前遇到錯誤,會返回以前成功讀取的名字構成的切片和該錯誤。
func (f *File) Truncate(size int64) error
Truncate改變文件的大小,它不會改變I/O的當前位置。 若是截斷文件,多出的部分就會被丟棄。若是出錯,錯誤底層類型是*PathError。
func (f *File) Seek(offset int64, whence int) (ret int64, err error)
Seek設置下一次讀/寫的位置。offset爲相對偏移量,而whence決定相對位置:0爲相對文件開頭,1爲相對當前位置,2爲相對文件結尾。它返回新的偏移量(相對開頭)和可能的錯誤。
func (f *File) Sync() (err error)
Sync遞交文件的當前內容進行穩定的存儲。通常來講,這表示將文件系統的最近寫入的數據在內存中的拷貝刷新到硬盤中穩定保存。
func (f *File) Close() error
Close關閉文件f,使文件不能用於讀寫。它返回可能出現的錯誤。
===================== STRUCT : Process================================
type ProcAttr struct {
// 若是Dir非空,子進程會在建立進程前先進入該目錄。(即設爲當前工做目錄)
Dir string // 若是Env非空,它會做爲新進程的環境變量。必須採用Environ返回值的格式。 // 若是Env爲空字符串,將使用Environ函數的返回值。 Env []string // Files指定被新進程繼承的活動文件對象。 // 前三個綁定爲標準輸入、標準輸出、標準錯誤輸出。 // 依賴底層操做系統的實現可能會支持額外的數據出入途徑。 // nil條目至關於在進程開始時關閉的文件對象。 Files []*File // 操做系統特定的建立屬性。 // 注意設置本字段意味着你的程序可能會運做失常甚至在某些操做系統中沒法經過編譯。 Sys *syscall.SysProcAttr }
ProcAttr保管將被StartProcess函數用於一個新進程的屬性。
type Process struct { Pid int // 內含隱藏或非導出字段 }
func FindProcess(pid int) (p *Process, err error)
FindProcess根據進程id查找一個運行中的進程。函數返回的進程對象能夠用於獲取其關於底層操做系統進程的信息。
func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error)
StartProcess使用提供的屬性、程序名、命令行參數開始一個新進程。StartProcess函數是一個低水平的接口。os/exec包提供了高水平的接口,應該儘可能使用該包。若是出錯,錯誤的底層類型會是*PathError。
func (p *Process) Signal(sig Signal) error
Signal方法向進程發送一個信號。在windows中向進程發送Interrupt信號還沒有實現。
func (p *Process) Kill() error
Kill讓進程馬上退出。
func (p *Process) Wait() (*ProcessState, error)
Wait方法阻塞直到進程退出,而後返回一個描述ProcessState描述進程的狀態和可能的錯誤。Wait方法會釋放綁定到進程p的全部資源。在大多數操做系統中,進程p必須是當前進程的子進程,不然會返回錯誤。
func (p *Process) Release() error
Release釋放進程p綁定的全部資源, 使它們(資源)不能再被(進程p)使用。只有沒有調用Wait方法時才須要調用本方法。
type ProcessState struct {
// 內含隱藏或非導出字段
}
ProcessState保管Wait函數報告的某個已退出進程的信息。
func (p *ProcessState) Pid() int
Pi返回一個已退出的進程的進程id。
func (p *ProcessState) Exited() bool
Exited報告進程是否已退出。
func (p *ProcessState) Success() bool
Success報告進程是否成功退出,如在Unix裏以狀態碼0退出。
func (p *ProcessState) SystemTime() time.Duration
SystemTime返回已退出進程及其子進程耗費的系統CPU時間。
func (p *ProcessState) UserTime() time.Duration
UserTime返回已退出進程及其子進程耗費的用戶CPU時間。
func (p *ProcessState) Sys() interface{}
Sys返回該已退出進程系統特定的退出信息。須要將其類型轉換爲適當的底層類型,如Unix裏轉換爲*syscall.WaitStatus類型以獲取其內容。
func (p *ProcessState) SysUsage() interface{}
SysUsage返回該已退出進程系統特定的資源使用信息。須要將其類型轉換爲適當的底層類型,如Unix裏轉換爲*syscall.Rusage類型以獲取其內容。
func (p *ProcessState) String() string