* Fileがファイルまたはディレクトリを指しているかどうかを確認する方法はありますか?
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
例えば、
_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:
_に置き換えます。
ここに別の可能性があります:
import "os"
func IsDirectory(path string) (bool, error) {
fileInfo, err := os.Stat(path)
if err != nil{
return false, err
}
return fileInfo.IsDir(), err
}
テストを1行で行う方法は次のとおりです。
if info, err := os.Stat(path); err == nil && info.IsDir() {
...
}
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
}
fileOrDir, err := os.Open(name)
if err != nil {
....
}
if fileOrDir.Stat().IsDir() {
....
} else {
...
}
ファイルを開いて名前でstatしないように注意してください。これにより、潜在的なセキュリティ上の影響を伴う競合状態が発生します。
オープンが成功した場合は、有効なファイルハンドルがあり、Stat()メソッドを使用して統計を取得する必要があります。最初にos.Stat()を呼び出し、次にos.Open()を呼び出すことをお勧めしますが、2つの呼び出しの間に誰かがファイルを変更する可能性があるため、上の答えは危険です。