path/filepath包下的相關函數(shù)
1. ToSlash函數(shù)
func ToSlash(path string) string
功能:將path中平臺相關的路徑分隔符轉換成'/'
例如:windows當前路徑: D:\gopro\src\study,轉換之后D:/gopro/src/study
2. FromSlash函數(shù)
func FromSlash(path string) string
功能:將 path 中的 '/' 轉換為系統(tǒng)相關的路徑分隔符
3.Dir函數(shù)
func Dir(path string) string
功能:獲取path中最后一個分隔符之前的部分(不包含分隔符)
4.Base函數(shù)
func Base(path string) string
功能:獲取path中最后一個分隔符之后的部分(不包含分隔符)
5.Split函數(shù)
func Split(path string) (dir, file string)
功能:獲取path中最后一個分隔符前后的兩部分,
dir是分隔符前面的部分包含分隔符,file是分隔符后面的部分不包含分隔符
6. Ext函數(shù)
func Ext(path string) string
功能:獲取路徑字符串中的文件擴展名
例如:
fmt.Println(“D:/gopro/src/aaa.txt”)
//如果該文件存在則會輸出: .txt
7.Rel函數(shù)
func Rel(basepath, targpath string) (string, error)
功能:
獲取targpath相對于basepath的路徑
要求targpaht和basepath必須"都是相對路徑"或都是"絕對路徑"
例如:
package main
import (
"fmt"
"path/filepath"
)
func main() {
// 都是絕對路徑
s, err := filepath.Rel(`/a/b/c`, `/a/b/c/d/e`)
fmt.Println(s, err) // d/e nil>
// 都是相對路徑
s, err = filepath.Rel(`a/b/c`, `a/b/c/d/e`)
fmt.Println(s, err) // d/e nil>
// 一個絕對一個相對
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
// 一個相對一個絕對
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` 進入 `a/b/d/e`,只需要進入 `../d/e` 即可
s, err = filepath.Rel(`a/b/c`, `a/b/d/e`)
fmt.Println(s, err) // ../d/e nil>
}
8.Join函數(shù)
func Join(elem ...string) string
功能:將elem中的多個元素合并成一個路徑,忽略空元素,清理多余字符
9.Clean函數(shù)
func Clean(path string) string
功能:
清除path中多余的字符
規(guī)則如下:
1.如果有多個分隔符,則只留一個
2.消除每一個.(當前路徑)路徑名
3.消除每一個..(父目錄)路徑名,以及它之前的非..元素
2和3使用于linux系統(tǒng)
10. IsAbs函數(shù)
func IsAbs(path string) (b bool)
功能:判斷該路徑是否是絕對路徑
11. Abs函數(shù)
func Abs(path string) (string, error)
功能:獲取path的絕對路徑
示例:
fmt.Println(filepath.Abs("b/c")) //返回結果:D:\gopro\src\study\b\c nil>
12. SplitList函數(shù)
func SplitList(path string) []string
功能:按os.PathListSeparator即(;)將路徑進行分割
13. VolumeName函數(shù)
func VolumeName(path string) string
功能:
返回路徑字符串中的卷名
如Windows 中的 `C:\Windows` 會返回 "C:"
14. EvalSymlinks函數(shù)
func EvalSymlinks(path string) (string, error)
功能:返回鏈接(快捷方式)所指向的實際文件
15.Match函數(shù)
func Match(pattern, name string) (matched bool, err error)
功能:
根據(jù)pattern來判斷name是否匹配,如果匹配則返回true
pattern 規(guī)則如下:
可以使用 ? 匹配單個任意字符(不匹配路徑分隔符)。
可以使用 * 匹配 0 個或多個任意字符(不匹配路徑分隔符)。
可以使用 [] 匹配范圍內的任意一個字符(可以包含路徑分隔符)。
可以使用 [^] 匹配范圍外的任意一個字符(無需包含路徑分隔符)。
[] 之內可以使用 - 表示一個區(qū)間,比如 [a-z] 表示 a-z 之間的任意一個字符。
反斜線用來匹配實際的字符,比如 \* 匹配 *,\[ 匹配 [,\a 匹配 a 等等。
[] 之內可以直接使用 [ * ?,但不能直接使用 ] -,需要用 \]、\- 進行轉義。
16.Glob函數(shù)
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+"/???"))
}
以上示例是列出當前文件夾下 名字為3個字符的文件或目錄
17.Walk函數(shù)
func Walk(root string, walkFn WalkFunc) error
功能:遍歷指定目錄(包括子目錄),對遍歷的項目用walkFn函數(shù)進行處理
walkFn函數(shù)如下:
type WalkFunc func(path string, info os.FileInfo, err error) error
path為當前文件或目錄的路徑,info為文件描述信息
規(guī)則如下:
文件處理函數(shù)定義如下,如果 WalkFunc 返回 nil,則 Walk 函數(shù)繼續(xù)遍歷,如果返回 SkipDir,則 Walk 函數(shù)會跳過當前目錄(如果當前遍歷到的是文件,則同時跳過后續(xù)文件及子目錄),繼續(xù)遍歷下一個目錄。如果返回其它錯誤,則 Walk 函數(shù)會中止遍歷。在 Walk 遍歷過程中,如果遇到錯誤,則會將錯誤通過 err 傳遞給WalkFunc 函數(shù),同時 Walk 會跳過出錯的項目,繼續(xù)處理后續(xù)項目。
示例:
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
})
}
以上示例是遍歷當前文件夾下名字為3個字符的文件或目錄及info信息,及滿足條件目錄下的子文件或子目錄。
path目錄下的相關函數(shù)
1. Join函數(shù)
func Join(elem ...string) string
功能:將多個path進行連接
2. Match函數(shù)
func Match(pattern, name string) (matched bool, err error)
功能:根據(jù)pattern進行匹配
3. IsAbs函數(shù)
func IsAbs(path string) bool
功能:是否是絕對路徑,判斷是否是以'/'結尾,不適用windows
4.Clean函數(shù)
func Clean(path string) string
功能:清除path中多余的字符
5.Ext函數(shù)
func Ext(path string) string
功能:獲取文件后綴名
6.Split函數(shù)
func Split(path string) (dir, file string)
功能:獲取path中最后一個分隔符前后的兩部分,分隔符前面的部分包含分隔符,后面的不包含分割符
7. Base函數(shù)
func Base(path string) string
功能:獲取path中最后一個分隔符之后的部分(不包含分隔符)
8.Dir函數(shù)
func Dir(path string) string
功能:獲取path的目錄,最后一個分隔符前面的內容
補充:golang中io/ioutil.readdir和path/filepath.walk遍歷獲取目錄下文件性能比較
在使用golang進行開發(fā),獲取當前目錄下文件或文件列表時候有兩種庫方法可以供使用。但是那種性能好,在網(wǎng)上沒有找到詳細的描述,因此自己寫了兩個函數(shù),進行了下比較。最終發(fā)現(xiàn)ioutil的效率要高很高。
具體執(zhí)行效果,獲取一個D盤目錄下總共340個文件,比較兩個函數(shù)耗時明顯發(fā)現(xiàn) ioutil的效率要高很多:
![](/d/20211017/28e46d0e805646f0e3d5e1bdceb296b7.gif)
下面就貼出源代碼,大家在這塊有更高效的處理,歡迎討論:
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 { //進行文件的復制
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)
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- golang 64位linux環(huán)境下編譯出32位程序操作
- golang-redis之sorted set類型操作詳解
- golang 字符串切片去重實例
- golang 解析word文檔操作
- golang逐行讀取文件的操作
- 以alpine作為基礎鏡像構建Golang可執(zhí)行程序操作
- golang 如何獲取pem格式RSA公私鑰長度