Golang 确定 *File 指向的是文件还是目录

huangapple go评论85阅读模式
英文:

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
}

huangapple
  • 本文由 发表于 2012年1月12日 02:24:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/8824571.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定