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

131

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

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

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

hardPass
источник
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