英文:
Golang Determining whether *File points to file or directory
问题
有没有办法确定我的*File指向的是文件还是目录?
fileOrDir, err := os.Open(name)
// 我如何知道我有一个文件还是目录?
如果是目录,我想能够读取有关文件的统计信息,如果是文件夹,我想能够读取文件夹中的文件
fileOrDir.Readdirnames(0) // 如果是目录
os.Stat(name) // 如果是文件
英文:
Is there a way to determine whether my *File is pointing to a file or a directory?
fileOrDir, err := os.Open(name)
// How do I know whether I have a file or directory?
I want to be able to read stats about the file if it is just a file, and be able to read the files within the directory if it is a directory
fileOrDir.Readdirnames(0) // If dir
os.Stat(name) // If file
答案1
得分: 82
例如,
package main
import (
"fmt"
"os"
)
func main() {
name := "FileOrDir"
fi, err := os.Stat(name)
if err != nil {
fmt.Println(err)
return
}
switch mode := fi.Mode(); {
case mode.IsDir():
// 处理目录
fmt.Println("目录")
case mode.IsRegular():
// 处理文件
fmt.Println("文件")
}
}
注意:
该示例适用于Go 1.1。对于Go 1.0,请将case mode.IsRegular():
替换为case mode&os.ModeType == 0:
。
英文:
For example,
package main
import (
"fmt"
"os"
)
func main() {
name := "FileOrDir"
fi, err := os.Stat(name)
if err != nil {
fmt.Println(err)
return
}
switch mode := fi.Mode(); {
case mode.IsDir():
// do directory stuff
fmt.Println("directory")
case mode.IsRegular():
// do file stuff
fmt.Println("file")
}
}
Note:
The example is for Go 1.1. For Go 1.0, replace case mode.IsRegular():
with case mode&os.ModeType == 0:
.
答案2
得分: 40
这里是另一种可能性:
import "os"
func IsDirectory(path string) (bool, error) {
fileInfo, err := os.Stat(path)
if err != nil {
return false, err
}
return fileInfo.IsDir(), err
}
英文:
Here is another possibility:
import "os"
func IsDirectory(path string) (bool, error) {
fileInfo, err := os.Stat(path)
if err != nil{
return false, err
}
return fileInfo.IsDir(), err
}
答案3
得分: 17
这是如何在一行中进行测试的方法:
if info, err := os.Stat(path); err == nil && info.IsDir() {
...
}
英文:
Here is how to do the test in one line:
if info, err := os.Stat(path); err == nil && info.IsDir() {
...
}
答案4
得分: 3
fileOrDir, err := os.Open(name)
if err != nil {
....
}
info, err := fileOrDir.Stat()
if err != nil {
....
}
if info.IsDir() {
....
} else {
...
}
请注意不要通过文件名打开和获取文件状态。这将产生潜在的安全问题的竞争条件。
如果打开成功,则拥有有效的文件句柄,应该使用它的Stat()方法来获取文件状态。顶部的答案是有风险的,因为他们建议先调用os.Stat(),然后再调用os.Open(),但是在两次调用之间,有人可能会更改文件。
英文:
fileOrDir, err := os.Open(name)
if err != nil {
....
}
info, err := fileOrDir.Stat()
if err != nil {
....
}
if info.IsDir() {
....
} else {
...
}
Be careful to not open and stat the file by name. This will produce a race condition with potential security implications.
If your open succeeds then your have a valid file handle and you should use the Stat() method on it to obtain the stat. The top answer is risky because they suggest to call os.Stat() first and then presumably os.Open() but someone could change the file in between the two calls.
答案5
得分: 1
import "os"
// FileExists报告指定的文件是否存在,返回一个布尔值
func FileExists(name string) bool {
if fi, err := os.Stat(name); err == nil {
if fi.Mode().IsRegular() {
return true
}
}
return false
}
// DirExists报告指定的目录是否存在,返回一个布尔值
func DirExists(name string) bool {
if fi, err := os.Stat(name); err == nil {
if fi.Mode().IsDir() {
return true
}
}
return false
}
英文:
import "os"
// FileExists reports whether the named file exists as a boolean
func FileExists(name string) bool {
if fi, err := os.Stat(name); err == nil {
if fi.Mode().IsRegular() {
return true
}
}
return false
}
// DirExists reports whether the dir exists as a boolean
func DirExists(name string) bool {
if fi, err := os.Stat(name); err == nil {
if fi.Mode().IsDir() {
return true
}
}
return false
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论