我上周开始使用Go。我一直在为csv文件做一个小的导入应用程序,现在我正在努力处理Go处理目录和文件的读取权限。
我想要做的是阅读文件夹,搜索csv文件并保存每个csv文件的内容,以便我可以通过http请求发送每个文件的内容。
这是我的代码:
func GetFileContent(fileName string) ([][]string, error) {
file, err := os.Open(fileName)
if err != nil {
log.Println("There was an error:", err)
return nil, err
}
defer file.Close()
reader := csv.NewReader(file)
reader.FieldsPerRecord = -1
csvFileContent, err := reader.ReadAll()
if err != nil {
log.Println("There was an error:", err)
return nil, err
}
return csvFileContent, nil
}
func GetFiles(importPath string, fileExtension string) ([]string, error) {
var result []string
directory, err := os.Open(importPath)
if err != nil {
return result, err
}
defer directory.Close()
files, err := directory.Readdir(-1)
if err != nil {
return result, err
}
for _, file := range files {
if file.Mode().IsRegular() {
if filepath.Ext(file.Name()) == "." + fileExtension {
log.Println("Import Files: ", file.Name())
result = append(result, file.Name())
}
}
}
if len(result) == 0 {
log.Println("No import files of type " + fileExtension + " found.")
log.Println("Import skipped.")
}
return result, nil
}
知道为什么我仍然分别找不到文件错误:打开:当我不使用我的应用程序的根文件夹/工作目录而是另一个(父)文件夹时,没有这样的文件或目录? 只要我使用./作为源文件夹,它就可以工作。
这可以通过一些小改动来解决,还是我必须使用另一个包和/或功能?
答案 0 :(得分:4)
FileInfo.Name返回文件的基本名称。您需要使用基本名称join目录名来获取文件路径。
在GetFiles中更改此行
result = append(result, file.Name())
到
result = append(result, filepath.Join(importPath, file.Name()))
答案 1 :(得分:3)
在这种情况下,您可以考虑使用更高级别的filepath.Glob():
files, err := filepath.Glob(filepath.Join(importPath, "*.csv"))