欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go語言中os包的用法實戰(zhàn)大全

 更新時間:2024年02月18日 09:55:25   作者:才華橫溢caozy  
Go在os中提供了文件的基本操作,包括通常意義的打開、創(chuàng)建、讀寫等操作,除此以外為了追求便捷以及性能上,Go還在io/ioutil以及bufio提供一些其他函數(shù)供開發(fā)者使用,這篇文章主要給大家介紹了關于go語言中os包用法的相關資料,需要的朋友可以參考下

前言

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 表示所有用戶都有讀、寫權限。

以下是文件權限的完整表格:

權限所有者組成員其他用戶
444
222
執(zhí)行111

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、GetgroupsGetgid、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、UnsetenvClearenv、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ù)和方法

    一文帶你了解Go語言標準庫strings的常用函數(shù)和方法

    strings?庫包含了許多高效的字符串常用操作的函數(shù)和方法,巧用這些函數(shù)與方法,能極大的提高我們程序的性能。本文就來和大家分享一下Go標準庫strings的常用函數(shù)和方法,希望對大家有所幫助
    2022-11-11
  • Go語言中的逃逸分析究竟是什么?

    Go語言中的逃逸分析究竟是什么?

    這篇文章主要介紹了Go語言中的逃逸,套喲究竟是什么呢?通俗來講,當一個對象的指針被多個方法或線程引用時,我們稱這個指針發(fā)生了“逃逸”。下面文章將詳細介紹Go語言中的逃逸,需要的朋友可以參考一下
    2021-09-09
  • Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人

    Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人

    這篇文章主要為大家介紹了Go使用Google?Gemini?Pro?API創(chuàng)建簡單聊天機器人實現(xiàn)過程詳解,本文將通過最新的gemini?go?sdk來實現(xiàn)命令行聊天機器人
    2023-12-12
  • golang logrus日志框架實例詳解

    golang logrus日志框架實例詳解

    logrus是一個可插拔的、結構化的日志框架,這篇文章主要介紹了golang logrus日志框架實例代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • Golang 類型轉換的實現(xiàn)(斷言、強制、顯式類型)

    Golang 類型轉換的實現(xiàn)(斷言、強制、顯式類型)

    將一個值從一種類型轉換到另一種類型,便發(fā)生了類型轉換,在go可以分為斷言、強制、顯式類型轉換,本文就詳細的介紹一下這就幾種轉換方式,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • 使用go gin來操作cookie的講解

    使用go gin來操作cookie的講解

    今天小編就為大家分享一篇關于使用go gin來操作cookie的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • golang整合jwt的實現(xiàn)示例

    golang整合jwt的實現(xiàn)示例

    json web tokens(jwt)已成為大多數(shù)web api設計中的常見身份驗證和授權方案之一,本文主要介紹了golang整合jwt的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-08-08
  • Golang內(nèi)存泄漏詳解之原因、檢測與修復過程

    Golang內(nèi)存泄漏詳解之原因、檢測與修復過程

    本文詳細介紹了Golang中的內(nèi)存泄漏問題,包括內(nèi)存泄漏的定義、分類、影響以及預防和修復方法,通過使用Golang自帶的性能分析工具和火焰圖工具,可以有效地檢測和定位內(nèi)存泄漏的代碼路徑,合理的代碼設計和定期的代碼審查也是預防內(nèi)存泄漏的關鍵
    2024-12-12
  • Go語言中sync.Cond使用詳解

    Go語言中sync.Cond使用詳解

    本文主要介紹了Go語言中sync.Cond使用詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • uber go zap 日志框架支持異步日志輸出

    uber go zap 日志框架支持異步日志輸出

    這篇文章主要為大家介紹了uber go zap 日志框架支持異步日志輸出示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01

最新評論