
go 的 `os.fileinfo.name()` 仅返回文件名(不含路径),若直接使用该名称打开文件,会因路径缺失导致 “open: no such file or directory” 错误;需用 `filepath.join()` 拼接完整路径才能安全访问子目录中的文件。
在 Go 中处理目录遍历与文件读取时,一个常见却容易被忽视的陷阱是:os.FileInfo.Name() 返回的只是文件或子目录的基名(basename),而非相对于当前工作目录或指定路径的完整路径。例如,当你调用 directory.Readdir(-1) 遍历 /data/import/ 目录时,file.Name() 可能返回 "orders.csv",但 os.Open("orders.csv") 实际尝试打开的是当前工作目录下的 ./orders.csv,而非 /data/import/orders.csv——这正是你遇到 open : no such file or directory 错误的根本原因。
要修复该问题,必须将传入的目录路径 importPath 与每个文件的基名显式拼接为绝对或相对完整路径。推荐使用标准库 path/filepath 提供的 filepath.Join() 函数,它能自动处理路径分隔符(如 / 或 \)并消除冗余,确保跨平台兼容性。
以下是修正后的 GetFiles 函数关键部分:
for _, file := range files {
if file.Mode().IsRegular() {
if filepath.Ext(file.Name()) == "."+fileExtension {
fullPath := filepath.Join(importPath, file.Name()) // ✅ 正确拼接完整路径
log.Println("Import File:", fullPath)
result = append(result, fullPath) // ✅ 存储完整路径,供后续读取使用
}
}
}同时,请确保 GetFileContent 函数能接收并正确处理该完整路径(当前代码已满足此要求,无需修改)。此外,建议增强健壮性,例如:
- 在 GetFiles 开头添加路径合法性检查:if importPath == "" { return nil, errors.New("import path cannot be empty") }
- 使用 filepath.Abs() 将相对路径转为绝对路径,便于调试和日志追踪;
- 对 filepath.Join(importPath, file.Name()) 的结果执行 os.Stat() 预检,避免符号链接或权限问题引发后续 os.Open 失败。
最后提醒:Go 不会自动解析路径上下文,所有文件操作都依赖你提供的精确路径字符串。养成「始终显式构造完整路径」的习惯,是编写可靠文件 I/O 逻辑的关键原则。









