如何在使用子目录时修复文件访问问题?

huangapple go评论112阅读模式
英文:

How to fix file access when using a sub-directory?

问题

Go语言如何处理对目录和文件的读取访问?

我想读取一个文件夹,搜索csv文件,并将每个csv文件的内容保存起来,以便通过HTTP请求发送内容。

以下是我的代码:

  1. func GetFileContent(fileName string) ([][]string, error) {
  2. file, err := os.Open(fileName)
  3. if err != nil {
  4. log.Println("There was an error:", err)
  5. return nil, err
  6. }
  7. defer file.Close()
  8. reader := csv.NewReader(file)
  9. reader.FieldsPerRecord = -1
  10. csvFileContent, err := reader.ReadAll()
  11. if err != nil {
  12. log.Println("There was an error:", err)
  13. return nil, err
  14. }
  15. return csvFileContent, nil
  16. }
  17. func GetFiles(importPath string, fileExtension string) ([]string, error) {
  18. var result []string
  19. directory, err := os.Open(importPath)
  20. if err != nil {
  21. return result, err
  22. }
  23. defer directory.Close()
  24. files, err := directory.Readdir(-1)
  25. if err != nil {
  26. return result, err
  27. }
  28. for _, file := range files {
  29. if file.Mode().IsRegular() {
  30. if filepath.Ext(file.Name()) == "."+fileExtension {
  31. log.Println("Import Files:", file.Name())
  32. result = append(result, file.Name())
  33. }
  34. }
  35. }
  36. if len(result) == 0 {
  37. log.Println("No import files of type " + fileExtension + " found.")
  38. log.Println("Import skipped.")
  39. }
  40. return result, nil
  41. }

当我不使用应用程序的根目录/工作目录,而是使用另一个(父级)文件夹时,会出现"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:

  1. func GetFileContent(fileName string) ([][]string, error) {
  2. file, err := os.Open(fileName)
  3. if err != nil {
  4. log.Println("There was an error:", err)
  5. return nil, err
  6. }
  7. defer file.Close()
  8. reader := csv.NewReader(file)
  9. reader.FieldsPerRecord = -1
  10. csvFileContent, err := reader.ReadAll()
  11. if err != nil {
  12. log.Println("There was an error:", err)
  13. return nil, err
  14. }
  15. return csvFileContent, nil
  16. }
  17. func GetFiles(importPath string, fileExtension string) ([]string, error) {
  18. var result []string
  19. directory, err := os.Open(importPath)
  20. if err != nil {
  21. return result, err
  22. }
  23. defer directory.Close()
  24. files, err := directory.Readdir(-1)
  25. if err != nil {
  26. return result, err
  27. }
  28. for _, file := range files {
  29. if file.Mode().IsRegular() {
  30. if filepath.Ext(file.Name()) == "." + fileExtension {
  31. log.Println("Import Files: ", file.Name())
  32. result = append(result, file.Name())
  33. }
  34. }
  35. }
  36. if len(result) == 0 {
  37. log.Println("No import files of type " + fileExtension + " found.")
  38. log.Println("Import skipped.")
  39. }
  40. return result, nil
  41. }

> 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 函数中将以下行更改为:

  1. result = append(result, file.Name())

更改为

  1. 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

  1. result = append(result, file.Name())

to

  1. result = append(result, filepath.Join(importPath, file.Name()))

答案2

得分: 3

在这种情况下,你可以考虑使用更高级的filepath.Glob()代替:

  1. files, err := filepath.Glob(filepath.Join(importPath, "*.csv"))
英文:

In this case, you might consider using the higher-level filepath.Glob() instead:

  1. files, err := filepath.Glob(filepath.Join(importPath, "*.csv"))

huangapple
  • 本文由 发表于 2015年1月23日 02:00:09
  • 转载请务必保留本文链接:https://go.coder-hub.com/28095639.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定