В стандартной библиотеке Go'нет функции, предназначенной исключительно для проверки существования или несуществования файла (как в Python'е os.path.exists
). Каков идиоматический способ сделать это?
Для проверки несуществования файла, эквивалентно Python'у if not os.path.exists(filename)
:
if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
// path/to/whatever does not exist
}
Чтобы проверить, существует ли файл, эквивалентно Python'у if os.path.exists(filename)
:
Отредактировано: в соответствии с последними комментариями
if _, err := os.Stat("/path/to/whatever"); err == nil {
// path/to/whatever exists
} else if os.IsNotExist(err) {
// path/to/whatever does *not* exist
} else {
// Schrodinger: file may or may not exist. See err for details.
// Therefore, do *NOT* use !os.IsNotExist(err) to test for file existence
}
Ответ Калеб запасной добавлено в [gonutsбыл][1] список рассылки.
[...] это's не действительно необходимо очень часто и [...] с помощью ОС.Стат-это достаточно легко для тех случаев, когда это требуется.
[...] например: если вы собираетесь открыть файл, там's нет причин, чтобы проверить, существует ли он первый. Файл может исчезнуть в промежутке между проверкой и открытием, и в любом случае вы'll необходимо, чтобы проверить ОС
.Ошибка открытия
вне зависимости от. Так что вы просто называете ОС.IsNotExist(энр)` после того как вы попробовать чтобы открыть файл, и интернет с его несуществование есть (если это требует особой обработки).
[...] вы Don'т нужно проверить на пути действующих на все (и вы должны'т).
- `ОС.Строительство MkdirAll ли или нет пути уже существуют. (Также нужно проверить ошибки из этого вызова.)
- вместо использования ОС.Создать
, Вы должны использовать
ОС.Функция openfile(путь, ОС.O_RDWR|ОС.O_CREATE|ОС.Указывает, 0666)` . Таким образом, вы'll получают ошибку, если файл уже существует. И это не'Т есть гонки с чем-то еще делает файл, в отличии от вашей версии, которая проверяет существовании.
Взято из: https://groups.google.com/forum/#!МСГ/golang-орехи/рейтинг ayx-BMNdMFo/4rL8FFHr8v4J
[1]: https://groups.google.com/forum/#!МСГ/golang-орехи/рейтинг ayx-BMNdMFo/4rL8FFHr8v4J
Вы должны использовать функции os.Stat()
и os.IsNotExist()
, как в следующем примере:
// Exists reports whether the named file or directory exists.
func Exists(name string) bool {
if _, err := os.Stat(name); err != nil {
if os.IsNotExist(err) {
return false
}
}
return true
}
Пример взят из здесь.
Пример example by user11617 неверен; он сообщит, что файл существует, даже в тех случаях, когда это не так, но произошла ошибка другого рода.
Сигнатура должна быть Exists(string) (bool, error). И тут, как водится, сайты вызова не лучше.
Код, который он написал, будет лучше выглядеть так:
func Exists(name string) bool {
_, err := os.Stat(name)
return !os.IsNotExist(err)
}
Но я предлагаю следующее:
func Exists(name string) (bool, error) {
_, err := os.Stat(name)
if os.IsNotExist(err) {
return false, nil
}
return err != nil, err
}
Позвольте's взглянуть на некоторые аспекты, во-первых, обе функции, представленной ОС
пакет golang
не ЖКХ, но ошибка в шашки, что я имею в виду, что они просто обертка для обработки ошибок на кросс-платформенность.
Так что в принципе если ОС.Стат
, если эта функция не'т дать какие-либо ошибки, что означает, что файл существует, если это действительно вам нужно проверить, какие ошибки он, а вот использовать эти две функции операционной системы.IsNotExist
и ОС.IsExist
.
Это можно понимать как стат
метания ошибка файла, потому что он не'т существует или это кидает ошибку, потому что он существует и есть некоторые проблемы с ним.
Параметр, что эти функции имеет тип ошибка
, хотя вы могли бы быть в состоянии пройти ноль
, но это не'т смысл.
Это также указывает на то, что IsExist не совпадает !IsNotExist
, они как две разные вещи.
Так что теперь, если вы хотите знать, если существует определенный файл в Go, я бы предпочел лучшим способом является:
if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
//TODO
}
Какие еще ответы пропустил, это путь, чтобы функция на самом деле может быть каталог. Следующая функция позволяет убедиться, что путь действительно файла.
`` функция fileExists(имяфайла строка) типа bool { информация, подстраховались := ОС.Стат(именем) если ОС.IsNotExist(энр) { возвращает false } возвращение !информация.IsDir() }
``
Другая вещь, чтобы отметить: этот код может привести к состоянию гонки, где другой поток или процесс удаляет или создает заданный файл, в то время как функция fileExists работает.
Если вы'вновь переживал по этому поводу, использовать блокировку в ваши темы, сериализовать доступ к этой функции или использовать межпроцессное семафор, если задействованы разные приложения. Если задействованы другие приложения, вне вашего контроля, вы'вновь повезло, я думаю.