英文:
How to fix file access when using a sub-directory?
问题
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
}
当我不使用应用程序的根目录/工作目录,而是使用另一个(父级)文件夹时,会出现"open: no such file or directory"的错误。只要我使用"./"作为源文件夹,它就能正常工作。
英文:
Which way Go does handle read access to directories and files?
I want to read a folder, search for csv files and save the content per csv file in order to send the content via http request.
Here's my code:
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
}
> Error: open : no such file or directory
appears when I do not use the root folder / working directory of my application but another (parent) folder? It works as long as I use ./ as source folder.
答案1
得分: 4
FileInfo.Name 返回文件的基本名称。您需要使用 join 函数将目录名称与基本名称连接起来,以获取文件路径。
在 GetFiles 函数中将以下行更改为:
result = append(result, file.Name())
更改为
result = append(result, filepath.Join(importPath, file.Name()))
英文:
FileInfo.Name returns the base name of the file. You need to join the directory name with the base name to get a file path.
Change this line in GetFiles
result = append(result, file.Name())
to
result = append(result, filepath.Join(importPath, file.Name()))
答案2
得分: 3
在这种情况下,你可以考虑使用更高级的filepath.Glob()代替:
files, err := filepath.Glob(filepath.Join(importPath, "*.csv"))
英文:
In this case, you might consider using the higher-level filepath.Glob() instead:
files, err := filepath.Glob(filepath.Join(importPath, "*.csv"))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论