Стандартная библиотека Go не имеет функции, предназначенной исключительно для проверки того, существует файл или нет (как в Python os.path.exists
). Какой идиоматический способ сделать это?
file
go
standard-library
Шридхар Ратнакумар
источник
источник
Ответы:
Чтобы проверить, не существует ли файл, эквивалентный Python
if not os.path.exists(filename)
:Чтобы проверить, существует ли файл, эквивалентный Python
if os.path.exists(filename)
:Отредактировано: за последние комментарии
источник
NOTEXIST
, например, если он/etc/bashrc
существует,/etc/bashrc/foobar
возвращаетсяENOTDIR
!os.IsNotExist(err)
. Возможно, файл существует, ноos.Stat
не работает по другим причинам (например, разрешение, сбой диска). Использованиеerr == nil
в качестве условия неправильно классифицирует такие сбои как «файл не существует».Ответ от Caleb Spare опубликован в списке рассылки Gonuts .
Взято из: https://groups.google.com/forum/#!msg/golang-nuts/Ayx-BMNdMFo/4rL8FFHr8v4J
источник
Вы должны использовать
os.Stat()
иos.IsNotExist()
функцию , как в следующем примере:Пример извлечен отсюда .
источник
Пример по user11617 неправилен; он сообщит, что файл существует даже в тех случаях, когда его нет, но произошла ошибка какого-либо другого рода.
Подпись должна быть Exists (string) (bool, error). И тогда, как это бывает, сайты вызовов не лучше.
Код, который он написал, будет лучше:
Но я предлагаю это вместо:
источник
err != nil
вместоerr == nil
? Если есть ошибка, то файл, вероятно, не существует?Что пропустили другие ответы, так это то, что путь к функции может быть каталогом. Следующая функция гарантирует, что путь действительно является файлом.
Еще один момент, на который следует обратить внимание: этот код все еще может привести к состоянию гонки, когда другой поток или процесс удаляет или создает указанный файл во время работы функции fileExists.
Если вас это беспокоит, используйте блокировку в своих потоках, сериализуйте доступ к этой функции или используйте межпроцессный семафор, если задействованы несколько приложений. Думаю, если другие приложения задействованы вне вашего контроля, вам не повезло.
источник
источник
Пример функции:
источник
Давайте сначала рассмотрим несколько аспектов. Обе функции, предоставляемые
os
пакетом, -golang
это не утилиты, а средства проверки ошибок. Я имею в виду, что они являются просто оболочкой для обработки ошибок на кроссплатформенной платформе.Таким образом, в основном,
os.Stat
если эта функция не выдает никакой ошибки, что означает, что файл существует, если вам нужно проверить, что это за ошибка, то здесь следует использовать эти две функцииos.IsNotExist
иos.IsExist
.Это может быть понято как
Stat
ошибка выброса файла, потому что он не существует, или это ошибка выброса, потому что он существует, и есть некоторая проблема с ним.Параметр, который принимают эти функции, имеет тип
error
, хотя вы можете передатьnil
его, но это не имеет смысла.Это также указывает на тот факт
IsExist is not same as !IsNotExist
, что это две разные вещи.Так что теперь, если вы хотите знать, существует ли данный файл в go, я бы предпочел лучший способ:
источник
Как уже упоминалось в других ответах, можно построить требуемое поведение / ошибки, используя различные флаги с
os.OpenFile
. На самом деле,os.Create
это просто сокращенная запись по умолчанию:Вы должны объединить эти флаги самостоятельно, чтобы получить интересующее вас поведение:
В зависимости от того, что вы выберете, вы получите разные ошибки.
Вот пример, где я хочу открыть файл для записи, но я урежу существующий файл, только если пользователь сказал, что все в порядке:
источник
Лучший способ проверить, существует ли файл:
источник