首页 > 解决方案 > 使用文件路径在 Go 中搜索文件

问题描述

我正在尝试使用 Go 在目录中查找文件。我正在使用文件路径包中的 Walk 功能。在 findFile 函数中,我获取文件并将指针分配给正在传递的文件。但这似乎不起作用,调用findFile后file的值仍然是nil。如果我做错了什么或者这种方法不正确,请提出建议。

func example() { 
   var file *os.File
   err = filepath.Walk("uploads", findFile(fileId, file))
   if err != nil {
       http.Error(w, err.Error(), http.StatusBadRequest)
       return
   }
}

func findFile(fileId string, file *os.File) func(path string, info os.FileInfo, err error) error {
    return func(path string, info os.FileInfo, err error) error {
        if err != nil {
             return err
        }

        if !info.IsDir() && isFileMatching(info.Name(), fileId) {
             file, err = os.Open(path)
             if err != nil {
                 return err
             }
        }
        return nil
    }

}

标签: gopointersclosures

解决方案


您正在更改指针变量的值,而不是指针指向的值。

它应该是:

f, err := os.Open(path)
if err != nil {
    return err
}
*file = *f

笔记:

*file = *f实际上是一个副本os.File

这不是一个好习惯。您可能需要考虑使用通道(和 goroutine)来完成此类工作。

而且您可能还想检查是否只有一个路径可以通过isFileMatching,或者它是文件描述符泄漏(不关闭打开的文件)。


推荐阅读