Golang Определение, * указывает ли файл на файл или каталог - PullRequest
29 голосов
/ 11 января 2012

Есть ли способ определить, указывает ли мой * 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

Ответы [ 5 ]

52 голосов
/ 11 января 2012

Например,

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:.

29 голосов
/ 29 августа 2014

Вот еще одна возможность:

import "os"

func IsDirectory(path string) (bool, error) {
    fileInfo, err := os.Stat(path)
    if err != nil{
      return false, err
    }
    return fileInfo.IsDir(), err
}
12 голосов
/ 12 февраля 2015

Вот как сделать тест в одну строку:

    if info, err := os.Stat(path); err == nil && info.IsDir() {
       ...
    }
0 голосов
/ 16 августа 2018
fileOrDir, err := os.Open(name)
if err != nil {
  ....
}
if fileOrDir.Stat().IsDir() {
   .... 
} else {
   ...
}

Будьте осторожны, чтобы не открывать и не оценивать файл по имени.Это создаст состояние гонки с потенциальными последствиями для безопасности.

Если ваше открытие завершилось успешно, у вас есть действительный дескриптор файла, и вы должны использовать метод Stat () для получения статистики.Верхний ответ рискован, потому что они предлагают сначала вызвать os.Stat (), а затем предположительно os.Open (), но кто-то может изменить файл между двумя вызовами.

0 голосов
/ 06 апреля 2018
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
}
...