Go 標準庫之 path/filepath(判斷絕對路徑、拆分目錄和文件、組合路徑、返回路徑目錄、獲取路徑最後文件名、獲取文件擴展名、路徑匹配規則、遞歸遍歷目錄)

1. 概述說明

import "path/filepath"

filepath 包實現了兼容各操作系統的文件路徑的實用操作函數。

2. 主要函數

2.1 func IsAbs

func IsAbs(path string) bool

IsAbs 返回路徑是否是一個絕對路徑。

2.2 func Abs

func Abs(path string) (string, error)

Abs 函數返回 path 代表的絕對路徑,如果 path 不是絕對路徑,會加入當前工作目錄以使之成爲絕對路徑。因爲硬鏈接的存在,不能保證返回的絕對路徑是唯一指向該地址的絕對路徑。

2.3 func Rel

func Rel(basepath, targpath string) (string, error)

Rel 函數返回一個相對路徑,將 basepath 和該路徑用路徑分隔符連起來的新路徑在詞法上等價於 targpath 。也就是說, Join(basepath, Rel(basepath, targpath)) 等價於 targpath 本身。如果成功執行,返回值總是相對於 basepath 的,即使 basepathtargpath 沒有共享的路徑元素。如果兩個參數一個是相對路徑而另一個是絕對路徑,或者 targpath 無法表示爲相對於 basepath 的路徑,將返回錯誤。

2.4 func SplitList

func SplitList(path string) []string

PATHGOPATH 等環境變量裏的多個路徑分割開(這些路徑被 OS 特定的表分隔符連接起來)。
strings.Split 函數的不同之處是:

  • ""SplitList 返回 []string{} ,而 strings.Split 返回 []string{""}

2.5 func Split

func Split(path string) (dir, file string)

Split 函數將路徑從最後一個路徑分隔符後面位置分隔爲兩個部分( dirfile )並返回。如果路徑中沒有路徑分隔符,函數返回值 dir 會設爲空字符串, file 會設爲 path 。兩個返回值滿足 path == dir+file

2.6 func Join

func Join(elem ...string) string

Join 函數可以將任意數量的路徑元素放入一個單一路徑裏,會根據需要添加路徑分隔符。結果是經過簡化的,所有的空字符串元素會被忽略。

2.7 func FromSlash

func FromSlash(path string) string

FromSlash 函數將 path 中的斜槓( / )替換爲路徑分隔符並返回替換結果,多個斜槓會替換爲多個路徑分隔符。

2.8 func ToSlash

func ToSlash(path string) string

ToSlash 函數將 path 中的路徑分隔符替換爲斜槓( / )並返回替換結果,多個路徑分隔符會替換爲多個斜槓。

2.9 func VolumeName

func VolumeName(path string) (v string)

VolumeName 函數返回最前面的卷名。

  • 如 Windows 系統裏提供參數"C:\foo\bar"會返回"C:";
  • Unix/linux系統的"\host\share\foo"會返回"\host\share";其他平臺會返回"";

2.10 func Dir

func Dir(path string) string

Dir 返回路徑除去最後一個路徑元素的部分,即該路徑最後一個元素所在的目錄。在使用 Split 去掉最後一個元素後,會簡化路徑並去掉末尾的斜槓。如果路徑是空字符串,會返回 . ;如果路徑由 1 到多個路徑分隔符後跟 0 到多個非路徑分隔符字符組成,會返回單個路徑分隔符;其他任何情況下都不會返回以路徑分隔符結尾的路徑。

2.11 func Base

func Base(path string) string

Base 函數返回路徑的最後一個元素。在提取元素前會求掉末尾的路徑分隔符。如果路徑是"",會返回".";如果路徑是隻有一個斜杆構成,會返回單個路徑分隔符。

2.12 func Ext

func Ext(path string) string

Ext 函數返回 path 文件擴展名。返回值是路徑最後一個路徑元素的最後一個 . 起始的後綴(包括 . )。如果該元素沒有 . 會返回空字符串。

2.13 func Clean

func Clean(path string) string

Clean 函數通過單純的詞法操作返回和 path 代表同一地址的最短路徑。

它會不斷的依次應用如下的規則,直到不能再進行任何處理:

  1. 將連續的多個路徑分隔符替換爲單個路徑分隔符
  2. 剔除每一個 . 路徑名元素(代表當前目錄)
  3. 剔除每一個路徑內的 .. 路徑名元素(代表父目錄)和它前面的非 .. 路徑名元素
  4. 剔除開始一個根路徑的 .. 路徑名元素,即將路徑開始處的 /.. 替換爲 / (假設路徑分隔符是 /

返回的路徑只有其代表一個根地址時才以路徑分隔符結尾,如Unix的 / 或Windows的C:\

如果處理的結果是空字符串,Clean會返回 .

2.14 func EvalSymlinks

func EvalSymlinks(path string) (string, error)

EvalSymlinks 函數返回 path 指向的符號鏈接(軟鏈接)所包含的路徑。如果 path 和返回值都是相對路徑,會相對於當前目錄;除非兩個路徑其中一個是絕對路徑。

2.15 func Match

func Match(pattern, name string) (matched bool, err error)

如果 name 匹配 shell 文件名模式匹配字符串, Match 函數返回真。該模式匹配字符串語法爲:

pattern:
				{ term }
term:
        '*'                                  匹配0或多個非路徑分隔符的字符
        '?'                                  匹配1個非路徑分隔符的字符
        '[' [ '^' ] { character-range } ']'  字符組(必須非空)
        c                                    匹配字符c(c != '*', '?', '\', '[')
        '\' c                               匹配字符c
        character-range:
        c           匹配字符c(c != '\', '-', ']')
        '\' c      匹配字符c
        lo '-' hi   匹配區間[lo, hi]內的字符
	

Match 要求匹配整個 name 字符串,而不是它的一部分。只有 pattern 語法錯誤時,會返回 ErrBadPattern
Windows系統中,不能進行轉義:’'被視爲路徑分隔符。

2.16 func Glob

func Glob(pattern string) (matches []string, err error)

Glob 函數返回所有匹配模式匹配字符串 pattern 的文件或者 nil (如果沒有匹配的文件)。 pattern 的語法和 Match 函數相同。 pattern 可以描述多層的名字,如 /usr/*/bin/ed (假設路徑分隔符是 / )。

2.17 type WalkFunc

type WalkFunc func(path string, info os.FileInfo, err error) error

Walk 函數對每一個文件 / 目錄都會調用 WalkFunc 函數類型值。調用時 path 參數會包含 Walkroot 參數作爲前綴;就是說,如果 Walk 函數的 rootdir ,該目錄下有文件 a ,將會使用 dir/a 調用 walkFn 參數。 walkFn 參數被調用時的 info 參數是 path 指定的地址(文件/目錄)的文件信息,類型爲 os.FileInfo

  • 如果遍歷 path 指定的文件或目錄時出現了問題,傳入的參數 err 會描述該問題, WalkFunc 類型函數可以決定如何去處理該錯誤( Walk 函數將不會深入該目錄);
  • 如果該函數返回一個錯誤, Walk 函數的執行會中止;
  • 只有一個例外,如果 WalkwalkFn 返回值是 SkipDir ,將會跳過該目錄的內容而 Walk 函數照常執行處理下一個文件。

2.18 func Walk

func Walk(root string, walkFn WalkFunc) error

Walk 函數會遍歷 root 指定的目錄下的文件樹,對每一個該文件樹中的目錄和文件都會調用 walkFn ,包括 root 自身。所有訪問文件 / 目錄時遇到的錯誤都會傳遞給 walkFn 過濾。文件是按詞法順序遍歷的,這讓輸出更漂亮,但也導致處理非常大的目錄時效率會降低。

Walk 函數不會遍歷文件樹中的符號鏈接(快捷方式)文件包含的路徑。

3. 示例代碼

func main() {
	// 判斷是否爲絕對路徑
	absFlag := filepath.IsAbs("/home/wohu/GoCode/src/task") // true
	// 獲取所給路徑的絕對路徑
	absPath, _ := filepath.Abs("./") // /home/wohu/GoCode
	// 返回以 basepath 爲基準的相對路徑
	relPath, _ := filepath.Rel("/home/wohu/GoCode/src", "/home/wohu/GoCode/src/task") // task
	// 將路徑使用路徑列表分隔符分開,見os.PathListSeparator
	splitList := filepath.SplitList("/home/wohu/GoCode:/usr/local/go:")
	// []string{"/home/wohu/GoCode", "/usr/local/go", ""}

	// 分割路徑中的目錄和文件
	dir, file := filepath.Split("/home/wohu/GoCode/src/main.go")
	// dir is "/home/wohu/GoCode/src/", file is "main.go"

	// 連接路徑,返回已經clean過的路徑
	joinPath := filepath.Join("/home", "wohu", "GoCode", "src", "..") // joinPath is  /home/wohu/GoCode
	// 將路徑中的 / 替換爲路徑分隔符
	fromSlash := filepath.FromSlash("/home/wohu/GoCode/src") // /home/wohu/GoCode/src
	// 將路徑分隔符使用/替換
	fmt.Println(filepath.ToSlash("/home/wohu/GoCode/src"))
	/*
		FromSlash、ToSlash 在跨平臺使用時比較方便,例如將 Windows 代碼移植到 Linux
	*/

	// 返回分區名
	fmt.Println(filepath.VolumeName("/home/wohu/GoCode/src"))
	// 返回最後一個元素所在目錄
	fmt.Println(filepath.Dir("/home/wohu/GoCode/src/main.go")) // /home/wohu/GoCode/src
	// 返回路徑的最後一個元素
	fmt.Println(filepath.Base("/home/wohu/GoCode/src/main.go")) // main.go
	// 返回路徑最後文件的擴展名
	fmt.Println(filepath.Ext("/home/wohu/GoCode/src/main.go")) // .go
	// 返回等價最短路徑
	fmt.Println(filepath.Clean("/home/wohu/GoCode/../GoCode/src/main.go"))
	// /home/wohu/GoCode/src/main.go

	//返回鏈接文件的實際路徑
	path2, _ := filepath.EvalSymlinks("1.lnk")
	fmt.Println(path2)
	//匹配文件名,完全匹配則返回true
	fmt.Println(filepath.Match("*", "a"))        // true <nil>
	fmt.Println(filepath.Match("*", "C:/a/b/c")) // false <nil>
	fmt.Println(filepath.Match("\\b", "b"))      // true <nil>

	//返回所有匹配的文件
	match, _ := filepath.Glob("/home/wohu/GoCode/src/task/*.txt")
	fmt.Println(match)
	// [/home/wohu/GoCode/src/task/test.txt /home/wohu/GoCode/src/task/test_bak.txt]

	//遍歷指定目錄下所有文件
	filepath.Walk("/home/wohu/GoCode/src/task/", func(path string, info os.FileInfo, err error) error {
		fmt.Println(path)
		return nil
	})
	fmt.Println("absFlag is ", absFlag)
	fmt.Println("absPath is ", absPath)
	fmt.Println("relPath is ", relPath)
	fmt.Printf("splitList %#v\n", splitList)

	fmt.Printf("dir is %#v, file is %#v\n", dir, file)
	fmt.Println("joinPath is ", joinPath)
	fmt.Println("fromSlash is ", fromSlash)

}

參考:
https://studygolang.com/static/pkgdoc/pkg/path_filepath.htm
https://www.cnblogs.com/jkko123/p/6923962.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章