如何在未知文件扩展名的情况下读取指定路径和名称的文件?
读取已知路径名称但扩展名未知的文件
在Go里直接用ioutil.ReadFile("./test")会失败,因为系统找不到确切名为test的文件——实际文件必然带扩展名(比如test.txt、test.csv这类)。要解决这个问题,你可以通过以下两种方式实现:
方法1:用通配符匹配目标文件
借助filepath.Glob,用./test.*匹配所有以test为文件名、任意扩展名的文件,再读取匹配结果:
package main import ( "io/ioutil" "path/filepath" "fmt" ) func main() { // 匹配所有前缀为test的文件 files, err := filepath.Glob("./test.*") if err != nil { fmt.Println("匹配文件失败:", err) return } if len(files) == 0 { fmt.Println("没找到匹配的文件") return } // 读取第一个匹配到的文件(多文件场景可自行加筛选逻辑) fileBytes, err := ioutil.ReadFile(files[0]) if err != nil { fmt.Println("读取文件失败:", err) return } fmt.Println("读取到的文件内容长度:", len(fileBytes)) }
方法2:遍历目录精准查找
如果需要排除特定扩展名,可遍历目标目录,逐个检查文件名前缀:
package main import ( "io/ioutil" "fmt" "path/filepath" ) func main() { targetName := "test" dir := "./" // 读取目录下所有条目 entries, err := ioutil.ReadDir(dir) if err != nil { fmt.Println("读取目录失败:", err) return } var targetFile string for _, entry := range entries { if entry.IsDir() { continue } // 剥离扩展名,获取纯文件名 fullName := entry.Name() baseName := fullName[:len(fullName)-len(filepath.Ext(fullName))] if baseName == targetName { targetFile = filepath.Join(dir, fullName) break } } if targetFile == "" { fmt.Println("未找到目标文件") return } fileBytes, err := ioutil.ReadFile(targetFile) if err != nil { fmt.Println("读取文件失败:", err) return } fmt.Println("读取到的文件内容长度:", len(fileBytes)) }
注意事项
- 如果目录下存在多个同名不同扩展名的文件(比如
test.txt和test.log),上述代码会读取第一个匹配到的文件,你可以根据需求添加扩展名优先级筛选。 - Go 1.16之后
ioutil已被标记为废弃,推荐用os.ReadFile替代ioutil.ReadFile,os.ReadDir替代ioutil.ReadDir,用法基本一致。
内容的提问来源于stack exchange,提问作者ERVIN228
相关产品推荐
相关产品推荐

