Golang确定* File是否指向文件或目录

时间:2012-01-11 18:24:06

标签: file go

有没有办法确定我的*文件是指向文件还是目录?

fileOrDir, err := os.Open(name)
// How do I know whether I have a file or directory?

我希望能够读取有关该文件的统计信息(如果它只是一个文件),并且能够读取目录中的文件(如果它是目录)

fileOrDir.Readdirnames(0) // If dir
os.Stat(name) // If file

5 个答案:

答案 0 :(得分:49)

例如,

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")
    }
}

注意:

示例适用于Go 1.1。对于Go 1.0,将case mode.IsRegular():替换为case mode&os.ModeType == 0:

答案 1 :(得分:28)

这是另一种可能性:

import "os"

func IsDirectory(path string) (bool, error) {
    fileInfo, err := os.Stat(path)
    if err != nil{
      return false, err
    }
    return fileInfo.IsDir(), err
}

答案 2 :(得分:12)

以下是如何在一行中进行测试:

    if info, err := os.Stat(path); err == nil && info.IsDir() {
       ...
    }

答案 3 :(得分:0)

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
}

答案 4 :(得分:0)

fileOrDir, err := os.Open(name)
if err != nil {
  ....
}
if fileOrDir.Stat().IsDir() {
   .... 
} else {
   ...
}

请注意不要按名称打开和统计文件。这将产生具有潜在安全隐患的竞争状况。

如果打开成功,则您具有有效的文件句柄,应在其上使用Stat()方法来获取统计信息。最好的答案是冒险的,因为他们建议先调用os.Stat(),然后再调用os.Open(),但有人可以在两次调用之间更改文件。