Как проверить, существует ли файл или каталог?


131

Я хочу проверить наличие файла ./conf/app.iniв моем коде Go, но не могу найти хороший способ сделать это.

Я знаю, что в Java есть метод File:, public boolean exists()который возвращает true, если файл или каталог существует.

Но как это сделать в Go?


7
Также обратите внимание, что в зависимости от того, как вы собираетесь использовать эту информацию, у вас есть состояние гонки. Все, что вы можете сказать, это то, что некоторое время назад файл существовал / не существовал; к тому времени, когда вы начнете действовать в соответствии с тестом, может произойти обратное. Обычно гораздо лучше проверять при выполнении любой операции, которую вы собираетесь выполнить (например, не проверять перед открытием существующего или созданием нового файла, а выполнить f, err := os.Open(name)или f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)и затем проверить os.IsNotExist(err)).
Dave C

Ответы:


189
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

Отредактировано для добавления обработки ошибок.


4
Для меня это похоже на «программирование исключений». Есть ли какой-нибудь ресурс, который оправдывает такой код как официальную парадигму #golang?
Olivier Amblet

21
@OlivierAmblet Здесь не происходит никаких исключений. Go использует panicдля фактического "исключения" как объект. Вы можете «поймать» звонком recover. Явный возврат errв качестве второго возвращаемого значения - чрезвычайно распространенный идиоматический прием Go. См .: golang.org/doc/effective_go.html#errors
Крис Пфол,

13
решение не очень простое, go особенный
zhaozhi

1
Это правда, что логической функции Exists нет, но код приложения может быть проще, если вы хотите только проверить наличие файла:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
Почему все на этом языке так сложно?
Top Cat

123

Вы можете использовать это:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

См .: http://golang.org/pkg/os/#IsNotExist


6
Это лучше, чем принятый ответ, но действительно ли необходимо предложение else?
Сергей Куликов

9
@SergeyKoulikov Могут быть и другие ошибки, например разрешительная.
Denys Séguret

22

Скорее к вашему сведению, так как я несколько минут огляделся вокруг, думая, что мой вопрос - это быстрый поиск.

Как проверить, представляет ли путь существующий каталог в Go?

Это был самый популярный ответ в моих результатах поиска, но здесь и в других местах решения обеспечивают только проверку существования. Чтобы проверить, pathпредставляет ли собой существующий каталог, я обнаружил, что могу легко:

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

Частично моя проблема заключалась в том, что я ожидал, что path/filepathпакет будет содержать функцию isDir ().



-2

Есть простой способ проверить, существует ли ваш файл или нет:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}

Это дубликат ответа Дени Сегюре.
StardustGogeta
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.