go語言中os包的用法實戰(zhàn)大全
前言
Go語言中的os包是操作系統(tǒng)包,提供了豐富的函數(shù)和方法用于與操作系統(tǒng)進行交互。本文將介紹一些常用的os包函數(shù)和方法,包括文件操作、進程管理、環(huán)境變量管理等。
一、文件權限符號
介紹os包之前我們先介紹一下文件權限。
1.1、定義
在 Golang 中,文件權限由三組數(shù)字表示,分別表示文件所有者、組成員和其他用戶。每組數(shù)字由三個數(shù)字組成,分別表示讀、寫和執(zhí)行權限。數(shù)字 0 表示沒有權限,數(shù)字 4 表示有讀權限,數(shù)字 2 表示有寫權限,數(shù)字 1表示有執(zhí)行權限。
因此,0666 表示所有用戶都有讀、寫權限。
以下是文件權限的完整表格:
權限 | 所有者 | 組成員 | 其他用戶 |
---|---|---|---|
讀 | 4 | 4 | 4 |
寫 | 2 | 2 | 2 |
執(zhí)行 | 1 | 1 | 1 |
1.2、POSIX標準
POSIX(Portable Operating System Interface for Unix)是一種定義了操作系統(tǒng)交互接口的標準,旨在確保在不同操作系統(tǒng)上的程序具有一致的行為。在POSIX標準中,文件權限通常以八進制數(shù)字表示,并且在數(shù)字前面加上一個"0"。
因此,為了遵循POSIX標準并與其他系統(tǒng)兼容,Go語言中的os.Stat函數(shù)將文件權限設置為0666而不是直接使用666。這樣可以確保在不同的操作系統(tǒng)上都能正確地解析和處理文件權限。
三、os包
3.1、獲取文件/文件夾信息
Stat(name string) (FileInfo, error) Lstat(name string) (FileInfo, error) IsExist(err error) bool // 指示是否已知錯誤以報告文件或目錄已存在。 IsNotExist(err error) bool // 是否已知錯誤以報告文件或目錄不存在。 IsPermission(err error) bool // 是否已知錯誤以報告權限被拒絕。 IsTimeout(err error) bool // 是否已知錯誤以報告發(fā)生了超時。 NewSyscallError(syscall string, err error) error // 以錯誤的形式返回一個新的 SyscallError,包含給定的系統(tǒng)調(diào)用名稱和錯誤詳細信息 //如果傳入的是一個符號鏈接,那么Lstat只返回該符號鏈接,不會跟蹤,其他沒區(qū)別。
返回FileInfo對象和error,如果報錯說明傳入的路徑不合法/不存在。FileInfo對象包含文件的一些信息:
// FileInfo 描述一個文件,由 Stat 返回。 type FileInfo interface { Name() string // 文件的基本名稱 Size() int64 // 常規(guī)文件的長度(以字節(jié)為單位);系統(tǒng)依賴于他人 Mode() FileMode // 文件模式位 ModTime() time.Time // 修改時間 IsDir() bool // Mode().IsDir()的縮寫。 Sys() any // 基礎數(shù)據(jù)源(可以返回nil) }
3.1.1、測試
package main import ( "fmt" "os" ) func main() { path := "D:/config/test/test.txt" stat, _ := os.Stat(path) fmt.Println("stat.Name():", stat.Name()) fmt.Println("stat.Size():", stat.Size()) fmt.Println("stat.Mode():", stat.Mode()) fmt.Println("stat.ModTime():", stat.ModTime()) fmt.Println("stat.IsDir():", stat.IsDir()) fmt.Println("stat.Sys():", stat.Sys()) }
3.1.2、輸出
stat.Name(): test.txt stat.Size(): 0 stat.Mode(): -rw-rw-rw- stat.ModTime(): 2023-12-19 10:26:07.3735891 +0800 CST stat.IsDir(): false stat.Sys(): &{32 {3102608083 31076898} {3102608083 31076898} {3102608083 31076898} 0 0}
3.2、創(chuàng)建文件
Create
Create(name string) (*File, error) // 創(chuàng)建文件,文件存在則覆蓋,底層調(diào)用的是OpenFile
- 創(chuàng)建的文件默認權限為0666,所有用戶都具有讀寫權限
- 以讀寫方式創(chuàng)建文件,如果文件已存在,則覆蓋。
返回*File指針對象和error,使用File對象,可以對文件進行讀寫操作。
CreateTemp
CreateTemp(dir, pattern string) (*File, error)
- 創(chuàng)建一個臨時文件,dir如果為空,則使用本地的臨時文件路徑,pattern為臨時文件名前綴
- dir為目錄名
3.3、打開文件
Open(name string) (*File, error) //以只讀方式打開文件 OpenFile(name string, flag int, perm FileMode) (*File, error) // 打開或創(chuàng)建文件
Open方法
- 以只讀方式打開文件,返回的File對象,可以調(diào)用指定讀操作的方法,不能調(diào)用寫操作方法
OpenFile方法
文件操作方式 中文釋義 注意事項
O_RDONLY 只讀 不能和O_WRONLY、O_RDWR一起使用
O_WRONLY 只寫 不能和O_RDONLY、O_RDWR一起使用
O_RDWR 讀寫 不能和O_WRONLY、O_WRONLY一起使用
O_APPEND 追加 和上邊三個之一進行或運算傳值,創(chuàng)建文件時,如果文件存在,則不會覆蓋
O_CREATE 創(chuàng)建 和上邊三個之一進行或運算傳值
O_EXCL 強制 與 O_CREATE 一起使用時,文件不能存在
O_SYNC 同步 打開以進行同步I/O。
O_TRUNC 存在則覆蓋 打開時截斷常規(guī)可寫文件。
3.3.1、測試
打開一個文件,如果文件不存在則創(chuàng)建,默認不會覆蓋
path := "D:/config/test/test.txt" //打開文件,如果文件不存在,則創(chuàng)建 file, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { fmt.Println("創(chuàng)建文件失?。?, err) return } fmt.Println(file)
3.4、寫文件
WriteFile(name string, data []byte, perm FileMode) error //寫文件,底層調(diào)用OPenFile,以只寫方式打開文件,如果文件存在,則覆蓋,不存在則創(chuàng)建
- 寫文件,底層調(diào)用OPenFile,以只寫方式打開文件,如果文件存在,則覆蓋,不存在則創(chuàng)建
- 底層調(diào)用的是File對象的Write方法寫文件。
3.5、讀文件
ReadFile(name string) ([]byte, error)
- 讀取整個文件并返回字節(jié)數(shù)組,error == nil代表讀取成功。
- 底層先調(diào)用Open以只讀方式打開文件,
- 再調(diào)用Read方法讀取文件所有內(nèi)容。
3.6、移動/重命名文件/目錄
Rename(oldpath, newpath string) error
- 文件和文件夾都可以移動
3.7、刪除文件或目錄
Remove(name string) error // 刪除文件 RemoveAll(path string) error //刪除目錄 // 刪除路徑及其包含的所有子路徑。它會刪除它能刪除的所有內(nèi)容,不存在不會報錯
不存在會報錯
3.8、創(chuàng)建目錄
Mkdir
Mkdir(name string, perm FileMode) error
- 創(chuàng)建一個具有指定名稱和權限位的新目錄
- 底層調(diào)用的是syscall
- 如果目錄已經(jīng)存在,則報錯
- 如果父目錄不存在,則報錯
MkdirAll
MkdirAll(path string, perm FileMode) error
- 遞歸方式創(chuàng)建目錄,如果父級目錄不存在,則先創(chuàng)建父級目錄
- 底層調(diào)用的是Mkdir哈函數(shù)。
- 如果目錄已經(jīng)存在,不會報錯。
創(chuàng)建臨時目錄-MkdirTemp
MkdirTemp(dir, pattern string) (string, error)
- 在你傳入的dir目錄下創(chuàng)建一個臨時目錄,pattern代表臨時目錄的前綴。
- 如果dir傳空,則默認為本機的臨時目錄路徑
- 底層調(diào)用Mkdir,權限0700。
3.9、更改文件/目錄權限
Chmod(name string, mode FileMode) error
3.10、獲取文件系統(tǒng)fs對象
DirFS(dir string) fs.FS
- 傳入一個文件路徑,返回fs對象,fs代表當前路徑
- fs有Open方法可以用來打開文件或目錄
3.11、獲取目錄下的所有文件
ReadDir(name string) ([]DirEntry, error)
- 獲取到所有文件和文件夾
返回的DirEntry對象如下:
// DirEntry 是從目錄讀取的條目(使用 ReadDir // 函數(shù)或 ReadDirFile 的 ReadDir 方法) type DirEntry interface { // Name 返回條目所描述的文件(或子目錄)的名稱。此名稱只是路徑的最后一個 // 元素(基本名稱),而不是整個路徑。例如,name將返回“hello.go”, // 而不是“ home/gopher/hello.go ”。 Name() string // IsDir 報告條目是否描述目錄。 IsDir() bool // Type 返回條目的類型位。類型位是由 FileMode.Type // 方法返回的常見 FileMode 位的子集。 Type() FileMode // Info 返回條目所描述的文件或子目錄的 FileInfo。 // 返回的 FileInfo 可以是讀取原始目錄的時間,也可 // 以是調(diào)用 Info 的時間。如果文件在目錄讀取后已被刪除或重 // 命名,則 Info 可能會返回滿足 errors.is(err,ErrNotExist)的錯誤。 // 如果條目表示符號鏈接, // 則 Info 報告有關鏈接本身的信息,而不是鏈接的目標 Info() (FileInfo, error) }
測試
func main() { path := "D:\\software" dir, err := os.ReadDir(path) if err != nil { fmt.Println(err) return } for i := 0; i < len(dir); i++ { fmt.Println(dir[i].Name()) fmt.Println(dir[i].IsDir()) fmt.Println(dir[i].Info()) fmt.Println(dir[i].Type()) } }
3.12、修改文件大小
Truncate(name string, size int64) error
更改命名文件的大小。如果文件是符號鏈接,它會更改鏈接目標的大小。
3.13、其他功能函數(shù)
- UserHomeDir() (string, error):返回當前用戶的主目錄。例如:C:\Users\用戶名
- 在 Unix 上,包括 macOS ,它返回 $HOME 環(huán)境變量。
- 在 Windows 上,它返回 %USERPROFILE%。
- 在 Plan9中,它返回 $home 環(huán)境變量。
- TempDir() string:返回用于臨時文件的默認目錄。例如:C:\Users\用戶名\AppData\Local\Temp
- 既不保證該目錄存在,也不保證該目錄具有可訪問權限
- UserConfigDir() (string, error):返回用于特定于用戶的配置數(shù)據(jù)的默認根目錄。例如:C:\Users\用戶名\AppData\Roaming
- UserCacheDir() (string, error):返回用于特定于用戶的緩存數(shù)據(jù)的默認根目錄。例如:C:\Users\用戶名\AppData\Local
- SameFile(fi1, fi2 FileInfo) bool:比較兩個文件對象是否相同
- Chmod(name string, mode FileMode):修改文件權限
- Link(oldname, newname string) error:創(chuàng)建新名稱作為指向舊名稱文件的硬鏈接。
- Symlink(oldname, newname string) error:創(chuàng)建 newname 作為到 oldname的符號鏈接。
- Readlink(name string) (string, error):返回命名符號鏈接的目標。
- IsPathSeparator(c uint8) bool:報告c是否為目錄分隔符。例如c為 ’ / ’
- Getwd() (dir string, err error):返回當前項目根路徑。例如:D:\goproject\gotest2。
- Chtimes(name string, atime time.Time, mtime time.Time) error:更改命名文件的訪問和修改時間,類似于Unix 的 utime() 或 utimes()函數(shù)。
3.14、進程/環(huán)境變量相關
- Exit(code int):Exit會導致當前程序退出,并返回給定的狀態(tài)代碼。代碼0表示成功,代碼非0表示錯誤。
- Getegid、Getgroups、Getgid、Geteuid、Getuid:非windows環(huán)境使用
- FindProcess(pid int) (*Process, error):根據(jù)pid獲取進程對象
- StartProcess(name string, argv []string, attr ProcAttr) (Process, error):啟動一個新進程,低級接口,os/exec 包提供更高級別的接口。
- Expand(s string, mapping func(string) string) string:根據(jù)映射函數(shù)替換字符串中的{var}或var 。例如,os.ExpanEnv(S)。相當于 os.Expand(s,os.Getenv)。
- ExpandEnv(s string) string:根據(jù)當前環(huán)境變量的值替換字符串中的 {var} 或 var。對未定義變量的引用將被空字符串替換。
- Getenv、LookupEnv、Setenv、Unsetenv、Clearenv、Environ:設置/取消等環(huán)境變量的操作。
- Getpagesize() int :返回底層系統(tǒng)的內(nèi)存頁面大小。本機window測試返回:4096
- Pipe() (r *File, w *File, err error):返回一對相連的文件;從 r 讀取返回寫入 w的字節(jié)。用于在兩個進程之間的管道傳遞數(shù)據(jù)。
- Chown、Lchown:更改指定文件的數(shù)字 uid 和 gid。
- Hostname() (name string, err error):返回內(nèi)核報告的主機名。例如:DESKTOP-A0ICVRQ
- Executable() (string, error):返回啟動當前進程的可執(zhí)行文件的路徑名。window環(huán)境返回空。
三、總結
os包是Go語言標準庫中提供的一種操作系統(tǒng)抽象接口,它提供了豐富的函數(shù)和方法來訪問和操作系統(tǒng)相關的功能。
文件操作:os包提供了許多用于文件操作的函數(shù),如Open、Create、Close、Read、Write等。其中最常用的是Open函數(shù),它可以打開一個文件并返回一個文件句柄,然后可以使用該句柄進行讀寫操作。
文件路徑操作:os包還提供了一些用于處理文件路徑的函數(shù),如Abs、Dir、Ext、IsAbs、IsDir、IsFile、Join等。這些函數(shù)可以方便地獲取文件路徑的信息,例如判斷一個路徑是否是絕對路徑或目錄等。
進程管理:os包中的Exec函數(shù)可以啟動一個新的進程,并執(zhí)行指定的命令。它還提供了一種方式來創(chuàng)建子進程,并在父進程中等待子進程結束。此外,os包還提供了一些用于進程管理的常量和變量,如ModeExecute、ModeCreate等。
環(huán)境變量操作:os包中的Getenv和Setenv函數(shù)可以獲取和設置環(huán)境變量的值。使用這兩個函數(shù)可以輕松地讀取和修改系統(tǒng)的環(huán)境變量。
錯誤處理:os包中的Error方法可以獲取最后一個錯誤信息的文本表示形式。在編寫程序時,如果需要檢查某個操作是否成功,可以使用這個方法來獲取錯誤信息并進行相應的處理。
總之,os包是Go語言中非常重要的一個標準庫,它提供了豐富的函數(shù)和方法來訪問和操作系統(tǒng)相關的功能。掌握這些用法可以幫助我們更加高效地編寫程序,并且能夠更好地處理與操作系統(tǒng)相關的問題。
到此這篇關于go語言中os包用法的文章就介紹到這了,更多相關go語言os包用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
一文帶你了解Go語言標準庫strings的常用函數(shù)和方法
strings?庫包含了許多高效的字符串常用操作的函數(shù)和方法,巧用這些函數(shù)與方法,能極大的提高我們程序的性能。本文就來和大家分享一下Go標準庫strings的常用函數(shù)和方法,希望對大家有所幫助2022-11-11Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人
這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人實現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實現(xiàn)命令行聊天機器人2023-12-12Golang 類型轉換的實現(xiàn)(斷言、強制、顯式類型)
將一個值從一種類型轉換到另一種類型,便發(fā)生了類型轉換,在go可以分為斷言、強制、顯式類型轉換,本文就詳細的介紹一下這就幾種轉換方式,具有一定的參考價值,感興趣的可以了解一下2023-09-09