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
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:
.
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
}
Voici comment faire le test en une seule ligne:
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 {
...
}
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.