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
的,即使 basepath
和 targpath
沒有共享的路徑元素。如果兩個參數一個是相對路徑而另一個是絕對路徑,或者 targpath
無法表示爲相對於 basepath
的路徑,將返回錯誤。
2.4 func SplitList
func SplitList(path string) []string
將 PATH
或 GOPATH
等環境變量裏的多個路徑分割開(這些路徑被 OS 特定的表分隔符連接起來)。
與 strings.Split
函數的不同之處是:
- 對
""
,SplitList
返回[]string{}
,而strings.Split
返回[]string{""}
。
2.5 func Split
func Split(path string) (dir, file string)
Split
函數將路徑從最後一個路徑分隔符後面位置分隔爲兩個部分( dir
和 file
)並返回。如果路徑中沒有路徑分隔符,函數返回值 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
代表同一地址的最短路徑。
它會不斷的依次應用如下的規則,直到不能再進行任何處理:
- 將連續的多個路徑分隔符替換爲單個路徑分隔符
- 剔除每一個
.
路徑名元素(代表當前目錄) - 剔除每一個路徑內的
..
路徑名元素(代表父目錄)和它前面的非..
路徑名元素 - 剔除開始一個根路徑的
..
路徑名元素,即將路徑開始處的/..
替換爲/
(假設路徑分隔符是/
)
返回的路徑只有其代表一個根地址時才以路徑分隔符結尾,如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
參數會包含 Walk
的 root
參數作爲前綴;就是說,如果 Walk
函數的 root
爲 dir
,該目錄下有文件 a
,將會使用 dir/a
調用 walkFn
參數。 walkFn
參數被調用時的 info
參數是 path
指定的地址(文件/目錄)的文件信息,類型爲 os.FileInfo
。
- 如果遍歷
path
指定的文件或目錄時出現了問題,傳入的參數err
會描述該問題,WalkFunc
類型函數可以決定如何去處理該錯誤(Walk
函數將不會深入該目錄); - 如果該函數返回一個錯誤,
Walk
函數的執行會中止; - 只有一個例外,如果
Walk
的walkFn
返回值是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