2017-07-16 28 views
2

我知道我可以通过以下问题的答案来检查文件是否存在或不存在于Golang中。如何检查Golang目录中是否存在文件`name`(带有任何扩展名)?

的代码看起来是这样的。

_, err := os.Stat(path) 
if err == nil { 
    log.Printf("File %s exists.", path) 
} else if os.IsNotExist(err) { 
    log.Printf("File %s not exists.", path) 
} else { 
    log.Printf("File %s stat error: %v", path, err) 
} 

但这里是我的真正的问题,我该如何检查确实存在(已使用)在指定的目录?例如,如果我有一个文件树这样的:

--- uploads 
     |- foo.png 
     |- bar.mp4 

我想看看是否有任何文件使用指定的名称..

used := filenameUsed("uploads/foo") 
fmt.Println(used) // Output: true 

used = filenameUsed("uploads/hello") 
fmt.Println(used) // Output: false 

如何实现filenameUsed功能?

谷歌给了我一个path/filepath包作为结果,但我不知道如何使用它。

回答

1

您可以使用filepath.Glob()功能,您可以指定模式列出文件。

要使用的图案基本上是您希望检查的名称,如果使用扩展图案。

实施例:

func filenameUsed(name string) (bool, error) { 
    matches, err := filepath.Glob(name + ".*") 
    if err != nil { 
     return false, err 
    } 
    return len(matches) > 0, nil 
} 

使用/测试它:

fmt.Print("Filename foo used: ") 
fmt.Println(filenameUsed("uploads/foo")) 
fmt.Print("Filename bar used: ") 
fmt.Println(filenameUsed("uploads/bar")) 

输出示例:

Filename foo used: true <nil> 
Filename bar used: false <nil> 

但是,请注意filenameUsed()返回false(和nil误差)并不意味着如果您尝试使用该名称的文件将不存在创建一个后。检查它并试图创建这样一个文件的含义并不能保证原子性。如果您的目的是在不使用名称的情况下创建文件,那么只需尝试以适当的模式创建文件(如果存在则不要覆盖),并处理该调用返回的(创建)错误。

相关问题