web-dev-qa-db-fra.com

Golang Déterminer si * File pointe sur un fichier ou un répertoire

Est-il possible de déterminer si mon * Fichier pointe vers un fichier ou un répertoire?

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

Je veux pouvoir lire des statistiques sur le fichier s'il ne s'agit que d'un fichier et pouvoir lire les fichiers du répertoire s'il s'agit d'un répertoire.

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

Par exemple,

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

Remarque:

L'exemple est pour Go 1.1. Pour Go 1.0, remplacez case mode.IsRegular(): par case mode&os.ModeType == 0:.

45
peterSO

Voici une autre possibilité:

import "os"

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

Voici comment faire le test en une seule ligne:

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

Veillez à ne pas ouvrir et stat le fichier par nom. Cela produira une situation critique avec des implications potentielles pour la sécurité.

Si votre ouverture réussit, alors vous avez un descripteur de fichier valide et vous devez utiliser la méthode Stat () dessus pour obtenir la stat. La première réponse est risquée, car ils suggèrent d'appeler d'abord os.Stat () puis vraisemblablement os.Open (), mais quelqu'un pourrait modifier le fichier entre les deux appels.

0
scudette