Golang 在 filepath.Glob 裡使用含方括號([ 跟 ])的路徑
Toby
Toby

由於 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)