由於 Golang 語言限制,filepath.Glob 裡面有一些字元是不能用的,例如說 [ 跟 ] 就是其中之一(還有 * 號,但是大部分作業系統都不會讓你把 * 號當作資料夾名稱,所以在這裡就不作處理了。一般來說,如果你要打開一個包含 [ ] 的路徑, filepath.Glob
會回傳空值。
path := "mymusic[mp3]/*"
files, err := filepath.Glob(path);
// files 會回傳空值
所以,很多工程師就幹脆不在資料夾名稱裡面使用 [ 跟 ],但是作為開發網頁版的檔案管理器,由於作為工程師是無法預計用戶的使用方式,我們必將要在 Glob 裡面支援 [ 跟 ],而方法可能比你想像中的簡單:
realpath := "mymusic[mp3]"
files, _ := filepath.Glob(realpath + "*")
//這裡的 files 會是空值,寫在這裡是為了在下面省下一個 else 的 case
if (strings.Contains(realpath, "[") == true || strings.Contains(realpath, "]") == true){
if (len(files) == 0){
//特別處理模式,以 * 號取代 [ 跟 ]
newSearchPath := strings.ReplaceAll(realpath, "[","*")
newSearchPath = strings.ReplaceAll(newSearchPath, "]","*")
//掃描與輸入路徑相近的路徑名稱
tmpFilelist, _ := filepath.Glob(newSearchPath + "*")
//在每個相近路徑中,找出擁有正確路徑的檔案
for _, file := range tmpFilelist{
file = filepath.ToSlash(file)
if strings.Contains(file, realpath){
files = append(files, file)
}
}
}
}
//正確回傳
log.Println(files)