最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang中的path/filepath包用法

 更新時(shí)間:2020年12月22日 10:06:29   作者:思維的深度  
這篇文章主要介紹了Golang中的path/filepath包用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧

path/filepath包下的相關(guān)函數(shù)

1. ToSlash函數(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

2. FromSlash函數(shù)

func FromSlash(path string) string

功能:將 path 中的 '/' 轉(zhuǎn)換為系統(tǒng)相關(guān)的路徑分隔符

3.Dir函數(shù)

func Dir(path string) string

功能:獲取path中最后一個(gè)分隔符之前的部分(不包含分隔符)

4.Base函數(shù)

func Base(path string) string

功能:獲取path中最后一個(gè)分隔符之后的部分(不包含分隔符)

5.Split函數(shù)

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

功能:獲取path中最后一個(gè)分隔符前后的兩部分,

dir是分隔符前面的部分包含分隔符,file是分隔符后面的部分不包含分隔符

6. Ext函數(shù)

func Ext(path string) string

功能:獲取路徑字符串中的文件擴(kuò)展名

例如:

fmt.Println(“D:/gopro/src/aaa.txt”)

//如果該文件存在則會(huì)輸出: .txt

7.Rel函數(shù)

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>
}

8.Join函數(shù)

func Join(elem ...string) string

功能:將elem中的多個(gè)元素合并成一個(gè)路徑,忽略空元素,清理多余字符

9.Clean函數(shù)

func Clean(path string) string

功能:

清除path中多余的字符

規(guī)則如下:

1.如果有多個(gè)分隔符,則只留一個(gè)

2.消除每一個(gè).(當(dāng)前路徑)路徑名

3.消除每一個(gè)..(父目錄)路徑名,以及它之前的非..元素

2和3使用于linux系統(tǒng)

10. IsAbs函數(shù)

func IsAbs(path string) (b bool)

功能:判斷該路徑是否是絕對(duì)路徑

11. Abs函數(shù)

func Abs(path string) (string, error)

功能:獲取path的絕對(duì)路徑

示例:

fmt.Println(filepath.Abs("b/c")) //返回結(jié)果:D:\gopro\src\study\b\c <nil>

12. SplitList函數(shù)

func SplitList(path string) []string

功能:按os.PathListSeparator即(;)將路徑進(jìn)行分割

13. VolumeName函數(shù)

func VolumeName(path string) string

功能:

返回路徑字符串中的卷名

如Windows 中的 `C:\Windows` 會(huì)返回 "C:"

14. EvalSymlinks函數(shù)

func EvalSymlinks(path string) (string, error)

功能:返回鏈接(快捷方式)所指向的實(shí)際文件

15.Match函數(shù)

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

功能:

根據(jù)pattern來判斷name是否匹配,如果匹配則返回true

pattern 規(guī)則如下:

可以使用 ? 匹配單個(gè)任意字符(不匹配路徑分隔符)。

可以使用 * 匹配 0 個(gè)或多個(gè)任意字符(不匹配路徑分隔符)。

可以使用 [] 匹配范圍內(nèi)的任意一個(gè)字符(可以包含路徑分隔符)。

可以使用 [^] 匹配范圍外的任意一個(gè)字符(無需包含路徑分隔符)。

[] 之內(nèi)可以使用 - 表示一個(gè)區(qū)間,比如 [a-z] 表示 a-z 之間的任意一個(gè)字符。

反斜線用來匹配實(shí)際的字符,比如 \* 匹配 *,\[ 匹配 [,\a 匹配 a 等等。

[] 之內(nèi)可以直接使用 [ * ?,但不能直接使用 ] -,需要用 \]、\- 進(jìn)行轉(zhuǎn)義。

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+"/???"))
}

以上示例是列出當(dāng)前文件夾下 名字為3個(gè)字符的文件或目錄

17.Walk函數(shù)

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ì)跳過當(dāng)前目錄(如果當(dāng)前遍歷到的是文件,則同時(shí)跳過后續(xù)文件及子目錄),繼續(xù)遍歷下一個(gè)目錄。如果返回其它錯(cuò)誤,則 Walk 函數(shù)會(huì)中止遍歷。在 Walk 遍歷過程中,如果遇到錯(cuò)誤,則會(huì)將錯(cuò)誤通過 err 傳遞給WalkFunc 函數(shù),同時(shí) Walk 會(huì)跳過出錯(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ù)

1. Join函數(shù)

func Join(elem ...string) string

功能:將多個(gè)path進(jìn)行連接

2. Match函數(shù)

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

功能:根據(jù)pattern進(jìn)行匹配

3. IsAbs函數(shù)

func IsAbs(path string) bool

功能:是否是絕對(duì)路徑,判斷是否是以'/'結(jié)尾,不適用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中最后一個(gè)分隔符前后的兩部分,分隔符前面的部分包含分隔符,后面的不包含分割符

7. Base函數(shù)

func Base(path string) string

功能:獲取path中最后一個(gè)分隔符之后的部分(不包含分隔符)

8.Dir函數(shù)

func Dir(path string) string

功能:獲取path的目錄,最后一個(gè)分隔符前面的內(nèi)容

補(bǔ)充:golang中io/ioutil.readdir和path/filepath.walk遍歷獲取目錄下文件性能比較

在使用golang進(jìn)行開發(fā),獲取當(dāng)前目錄下文件或文件列表時(shí)候有兩種庫方法可以供使用。但是那種性能好,在網(wǎng)上沒有找到詳細(xì)的描述,因此自己寫了兩個(gè)函數(shù),進(jìn)行了下比較。最終發(fā)現(xiàn)ioutil的效率要高很高。

具體執(zhí)行效果,獲取一個(gè)D盤目錄下總共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ò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:

相關(guān)文章

  • golang?gorm學(xué)習(xí)之如何指定數(shù)據(jù)表

    golang?gorm學(xué)習(xí)之如何指定數(shù)據(jù)表

    在sql中首先要指定是從哪張表中查詢,所以這篇文章小編就來帶大家一起看一下gorm是如何根據(jù)model來自動(dòng)解析表名的,感興趣的小伙伴可以了解下
    2023-08-08
  • golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫logrus的詳解

    golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫logrus的詳解

    這篇文章主要介紹了golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫logrus的詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 深入講解Go語言中函數(shù)new與make的使用和區(qū)別

    深入講解Go語言中函數(shù)new與make的使用和區(qū)別

    大家都知道Go語言中的函數(shù)new與函數(shù)make一直是新手比較容易混淆的東西,看著相似,但其實(shí)不同,不過解釋兩者之間的不同也非常容易,下面這篇文章主要給大家介紹了關(guān)于Go語言中函數(shù)new與make區(qū)別的相關(guān)資料,需要的朋友可以參考下。
    2017-10-10
  • 簡(jiǎn)單聊聊Golang中defer預(yù)計(jì)算參數(shù)

    簡(jiǎn)單聊聊Golang中defer預(yù)計(jì)算參數(shù)

    在golang當(dāng)中defer代碼塊會(huì)在函數(shù)調(diào)用鏈表中增加一個(gè)函數(shù)調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Golang中defer預(yù)計(jì)算參數(shù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • 使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作

    使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作

    這篇文章主要介紹了使用go語言實(shí)現(xiàn)查找兩個(gè)數(shù)組的異同操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang中crypto/ecdsa庫實(shí)現(xiàn)數(shù)字簽名和驗(yàn)證

    Golang中crypto/ecdsa庫實(shí)現(xiàn)數(shù)字簽名和驗(yàn)證

    本文主要介紹了Golang中crypto/ecdsa庫實(shí)現(xiàn)數(shù)字簽名和驗(yàn)證,將從ECDSA的基本原理出發(fā),詳細(xì)解析如何在Go語言中實(shí)現(xiàn)數(shù)字簽名和驗(yàn)證,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • Golang二維切片初始化的實(shí)現(xiàn)

    Golang二維切片初始化的實(shí)現(xiàn)

    這篇文章主要介紹了Golang二維切片初始化的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Go語言實(shí)現(xiàn)RSA加解密算法詳解

    Go語言實(shí)現(xiàn)RSA加解密算法詳解

    隨著互聯(lián)網(wǎng)的高速發(fā)展,人們對(duì)安全的要求也越來越高,加解密也變得越來越重要,本文主要為大家介紹了Go語言中實(shí)現(xiàn)RSA加解密與簽名驗(yàn)證算法,希望對(duì)大家有所幫助
    2023-06-06
  • 詳解Golang如何優(yōu)雅判斷interface是否為nil

    詳解Golang如何優(yōu)雅判斷interface是否為nil

    這篇文章主要為大家詳細(xì)介紹了Golang如何優(yōu)雅判斷interface是否為nil的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下
    2024-01-01
  • go?install和go?get的區(qū)別實(shí)例詳解

    go?install和go?get的區(qū)別實(shí)例詳解

    go install是Golang用來編譯和安裝自定義package的工具,下面這篇文章主要給大家介紹了關(guān)于go?install和go?get區(qū)別的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評(píng)論

曲周县| 乃东县| 鱼台县| 云林县| 洪江市| 得荣县| 皮山县| 临漳县| 南投县| 澄江县| 德阳市| 兴仁县| 洪湖市| 巢湖市| 海淀区| 绍兴县| 伊金霍洛旗| 镇康县| 什邡市| 启东市| 隆林| 贡山| 湛江市| 双鸭山市| 奇台县| 两当县| 德兴市| 澎湖县| 新乡市| 乌兰浩特市| 栾城县| 兴义市| 博野县| 广东省| 周至县| 巴彦县| 桂平市| 塔城市| 东光县| 额尔古纳市| 县级市|