path/filepath包下的相關(guān)函數(shù)
func ToSlash(path string) string
功能:將path中平臺(tái)相關(guān)的路徑分隔符轉(zhuǎn)換成'/'
例如:windows當(dāng)前路徑: D:\gopro\src\study,轉(zhuǎn)換之后D:/gopro/src/study
func FromSlash(path string) string
功能:將 path 中的 '/' 轉(zhuǎn)換為系統(tǒng)相關(guān)的路徑分隔符
func Dir(path string) string
功能:獲取path中最后一個(gè)分隔符之前的部分(不包含分隔符)
func Base(path string) string
功能:獲取path中最后一個(gè)分隔符之后的部分(不包含分隔符)
func Split(path string) (dir, file string)
功能:獲取path中最后一個(gè)分隔符前后的兩部分,
dir是分隔符前面的部分包含分隔符,file是分隔符后面的部分不包含分隔符
func Ext(path string) string
功能:獲取路徑字符串中的文件擴(kuò)展名
例如:
fmt.Println(“D:/gopro/src/aaa.txt”)
//如果該文件存在則會(huì)輸出: .txt
func Rel(basepath, targpath string) (string, error)
功能:
獲取targpath相對(duì)于basepath的路徑
要求targpaht和basepath必須"都是相對(duì)路徑"或都是"絕對(duì)路徑"
例如:
package main import ( "fmt" "path/filepath" ) func main() { // 都是絕對(duì)路徑 s, err := filepath.Rel(`/a/b/c`, `/a/b/c/d/e`) fmt.Println(s, err) // d/e nil> // 都是相對(duì)路徑 s, err = filepath.Rel(`a/b/c`, `a/b/c/d/e`) fmt.Println(s, err) // d/e nil> // 一個(gè)絕對(duì)一個(gè)相對(duì) s, err = filepath.Rel(`/a/b/c`, `a/b/c/d/e`) fmt.Println(s, err) // Rel: can't make a/b/c/d/e relative to /a/b/c // 一個(gè)相對(duì)一個(gè)絕對(duì) s, err = filepath.Rel(`a/b/c`, `/a/b/c/d/e`) fmt.Println(s, err) // Rel: can't make /a/b/c/d/e relative to a/b/c // 從 `a/b/c` 進(jìn)入 `a/b/d/e`,只需要進(jìn)入 `../d/e` 即可 s, err = filepath.Rel(`a/b/c`, `a/b/d/e`) fmt.Println(s, err) // ../d/e nil> }
func Join(elem ...string) string
功能:將elem中的多個(gè)元素合并成一個(gè)路徑,忽略空元素,清理多余字符
func Clean(path string) string
功能:
清除path中多余的字符
規(guī)則如下:
1.如果有多個(gè)分隔符,則只留一個(gè)
2.消除每一個(gè).(當(dāng)前路徑)路徑名
3.消除每一個(gè)..(父目錄)路徑名,以及它之前的非..元素
2和3使用于linux系統(tǒng)
func IsAbs(path string) (b bool)
功能:判斷該路徑是否是絕對(duì)路徑
func Abs(path string) (string, error)
功能:獲取path的絕對(duì)路徑
示例:
fmt.Println(filepath.Abs("b/c")) //返回結(jié)果:D:\gopro\src\study\b\c nil>
func SplitList(path string) []string
功能:按os.PathListSeparator即(;)將路徑進(jìn)行分割
func VolumeName(path string) string
功能:
返回路徑字符串中的卷名
如Windows 中的 `C:\Windows` 會(huì)返回 "C:"
func EvalSymlinks(path string) (string, error)
功能:返回鏈接(快捷方式)所指向的實(shí)際文件
func Match(pattern, name string) (matched bool, err error)
功能:
根據(jù)pattern來(lái)判斷name是否匹配,如果匹配則返回true
pattern 規(guī)則如下:
可以使用 ? 匹配單個(gè)任意字符(不匹配路徑分隔符)。
可以使用 * 匹配 0 個(gè)或多個(gè)任意字符(不匹配路徑分隔符)。
可以使用 [] 匹配范圍內(nèi)的任意一個(gè)字符(可以包含路徑分隔符)。
可以使用 [^] 匹配范圍外的任意一個(gè)字符(無(wú)需包含路徑分隔符)。
[] 之內(nèi)可以使用 - 表示一個(gè)區(qū)間,比如 [a-z] 表示 a-z 之間的任意一個(gè)字符。
反斜線用來(lái)匹配實(shí)際的字符,比如 \* 匹配 *,\[ 匹配 [,\a 匹配 a 等等。
[] 之內(nèi)可以直接使用 [ * ?,但不能直接使用 ] -,需要用 \]、\- 進(jìn)行轉(zhuǎn)義。
func Glob(pattern string) (matches []string, err error)
功能:列出與指定的模式 pattern 完全匹配的文件或目錄(匹配原則同上)
示例:
package main import ( "os" "fmt" "path/filepath" ) func main() { pwd,_ := os.Getwd() fmt.Println(filepath.Glob(pwd+"/???")) }
以上示例是列出當(dāng)前文件夾下 名字為3個(gè)字符的文件或目錄
func Walk(root string, walkFn WalkFunc) error
功能:遍歷指定目錄(包括子目錄),對(duì)遍歷的項(xiàng)目用walkFn函數(shù)進(jìn)行處理
walkFn函數(shù)如下:
type WalkFunc func(path string, info os.FileInfo, err error) error
path為當(dāng)前文件或目錄的路徑,info為文件描述信息
規(guī)則如下:
文件處理函數(shù)定義如下,如果 WalkFunc 返回 nil,則 Walk 函數(shù)繼續(xù)遍歷,如果返回 SkipDir,則 Walk 函數(shù)會(huì)跳過(guò)當(dāng)前目錄(如果當(dāng)前遍歷到的是文件,則同時(shí)跳過(guò)后續(xù)文件及子目錄),繼續(xù)遍歷下一個(gè)目錄。如果返回其它錯(cuò)誤,則 Walk 函數(shù)會(huì)中止遍歷。在 Walk 遍歷過(guò)程中,如果遇到錯(cuò)誤,則會(huì)將錯(cuò)誤通過(guò) err 傳遞給WalkFunc 函數(shù),同時(shí) Walk 會(huì)跳過(guò)出錯(cuò)的項(xiàng)目,繼續(xù)處理后續(xù)項(xiàng)目。
示例:
package main import ( "os" "fmt" "path/filepath" ) func main() { pwd,_ := os.Getwd() filepath.Walk(pwd,func(fpath string, info os.FileInfo, err error) error { if match,err := filepath.Match("???",filepath.Base(fpath)); match { fmt.Println("path:",fpath) fmt.Println("info:",info) return err } return nil }) }
以上示例是遍歷當(dāng)前文件夾下名字為3個(gè)字符的文件或目錄及info信息,及滿足條件目錄下的子文件或子目錄。
path目錄下的相關(guān)函數(shù)
func Join(elem ...string) string
功能:將多個(gè)path進(jìn)行連接
func Match(pattern, name string) (matched bool, err error)
功能:根據(jù)pattern進(jìn)行匹配
func IsAbs(path string) bool
功能:是否是絕對(duì)路徑,判斷是否是以'/'結(jié)尾,不適用windows
func Clean(path string) string
功能:清除path中多余的字符
func Ext(path string) string
功能:獲取文件后綴名
func Split(path string) (dir, file string)
功能:獲取path中最后一個(gè)分隔符前后的兩部分,分隔符前面的部分包含分隔符,后面的不包含分割符
func Base(path string) string
功能:獲取path中最后一個(gè)分隔符之后的部分(不包含分隔符)
func Dir(path string) string
功能:獲取path的目錄,最后一個(gè)分隔符前面的內(nèi)容
補(bǔ)充:golang中io/ioutil.readdir和path/filepath.walk遍歷獲取目錄下文件性能比較
在使用golang進(jìn)行開(kāi)發(fā),獲取當(dāng)前目錄下文件或文件列表時(shí)候有兩種庫(kù)方法可以供使用。但是那種性能好,在網(wǎng)上沒(méi)有找到詳細(xì)的描述,因此自己寫(xiě)了兩個(gè)函數(shù),進(jìn)行了下比較。最終發(fā)現(xiàn)ioutil的效率要高很高。
具體執(zhí)行效果,獲取一個(gè)D盤(pán)目錄下總共340個(gè)文件,比較兩個(gè)函數(shù)耗時(shí)明顯發(fā)現(xiàn) ioutil的效率要高很多:
下面就貼出源代碼,大家在這塊有更高效的處理,歡迎討論:
package main import ( "fmt" "io/ioutil" "os" "path/filepath" "time" ) func GetAllFile(pathname string, s []string) ([]string, error) { fromSlash := filepath.FromSlash(pathname) //fmt.Println(fromSlash) rd, err := ioutil.ReadDir(fromSlash) if err != nil { //log.LOGGER("Error").Error("read dir fail %v\n", err) fmt.Println("read dir fail:", err) return s, err } for _, fi := range rd { if fi.IsDir() { fullDir:= filepath.Join(fromSlash,fi.Name()) s, err = GetAllFile(fullDir, s) if err != nil { fmt.Println("read dir fail:", err) //log.LOGGER("Error").Error("read dir fail: %v\n", err) return s, err } } else { fullName:= filepath.Join(fromSlash,fi.Name()) s = append(s, fullName) } } return s, nil } func GetALLFIles_walk(pathname string)([]string){ StartTime :=time.Now(); dst_target :=[]string{} err := filepath.Walk(pathname, func(src string, f os.FileInfo, err error) error { if f == nil { return err } if f.IsDir(){ return nil }else { //進(jìn)行文件的復(fù)制 dst_target=append(dst_target,src) //return s } //println(path) return nil }) if err != nil { fmt.Printf("filepath.Walk() returned %v\n", err) return nil //log.LOGGER("Error").Error("filepath.Walk() returned %v\n", err) } fmt.Println("Cost Time:",time.Since(StartTime)) return dst_target } func main(){ s:=[]string{} n:=[]string{} pathname:="D://go_copysrc" fmt.Printf("filepath walk cost time returned \n") n = GetALLFIles_walk(pathname) fmt.Println("the number of file is %v,content is:%v",len(n),n) fmt.Printf("io util cost time returned \n") StartTime :=time.Now(); s,_=GetAllFile(pathname,s) fmt.Println("Cost Time:",time.Since(StartTime)) fmt.Println("the number of file is %v,content is:%v",len(s),s) }
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
標(biāo)簽:電子產(chǎn)品 物業(yè)服務(wù) 西雙版納 儋州 海南 遼寧 安康 青海
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Golang中的path/filepath包用法》,本文關(guān)鍵詞 Golang,中的,path,filepath,包用法,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。