如何检查 Golang 目录中是否存在文件`name`(具有任何扩展名)?
How to check file `name` (with any extension) does exist in the directory in Golang?
我知道我可以通过以下问题的答案来检查文件在 Golang 中是否存在。
- How to check whether a file or directory denoted by a path exists in Golang?
- How to check if a file exists in Go?
- Gist - Check if file or directory exists in Golang
代码如下所示。
_, 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
功能?
结果 Google 给了我一个 path/filepath
包,但我不知道如何使用它。
您可以使用 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
错误)并不意味着如果您之后尝试创建一个具有该名称的文件将不存在。意味着检查它并尝试创建这样的文件并不能保证原子性。如果您的目的是在不使用名称的情况下创建文件,那么只需尝试以正确的模式创建文件(如果存在则不要覆盖),并处理该调用返回的(创建)错误。
我知道我可以通过以下问题的答案来检查文件在 Golang 中是否存在。
- How to check whether a file or directory denoted by a path exists in Golang?
- How to check if a file exists in Go?
- Gist - Check if file or directory exists in Golang
代码如下所示。
_, 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
功能?
Google 给了我一个 path/filepath
包,但我不知道如何使用它。
您可以使用 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
错误)并不意味着如果您之后尝试创建一个具有该名称的文件将不存在。意味着检查它并尝试创建这样的文件并不能保证原子性。如果您的目的是在不使用名称的情况下创建文件,那么只需尝试以正确的模式创建文件(如果存在则不要覆盖),并处理该调用返回的(创建)错误。