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