web-dev-qa-db-ja.com

GoFileが* Fileがファイルまたはディレクトリを指しているかどうかを判断する

* 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
35
NominSim

例えば、

_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:_に置き換えます。

61
peterSO

ここに別の可能性があります:

import "os"

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

テストを1行で行う方法は次のとおりです。

    if info, err := os.Stat(path); err == nil && info.IsDir() {
       ...
    }
12
tst
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
}
1
farhany
fileOrDir, err := os.Open(name)
if err != nil {
  ....
}
if fileOrDir.Stat().IsDir() {
   .... 
} else {
   ...
}

ファイルを開いて名前でstatしないように注意してください。これにより、潜在的なセキュリティ上の影響を伴う競合状態が発生します。

オープンが成功した場合は、有効なファイルハンドルがあり、Stat()メソッドを使用して統計を取得する必要があります。最初にos.Stat()を呼び出し、次にos.Open()を呼び出すことをお勧めしますが、2つの呼び出しの間に誰かがファイルを変更する可能性があるため、上の答えは危険です。

0
scudette