Как проверить, существует ли файл в Go?
стандартная библиотека Go не имеет функции, предназначенной исключительно для проверки того, существует ли файл или нет (например, Python os.path.exists). Что такое идиоматическое как это сделать?
7 ответов:
чтобы проверить, не существует ли файл, эквивалентный 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"); !os.IsNotExist(err) { // path/to/whatever exists }
ответ Запасные Калеб опубликовано на gonutsбыл список рассылки.
[...] Это на самом деле не нужно очень часто и [...] используя
os.Statis достаточно легко для тех случаев, когда это требуется.[... Например: если вы собираетесь открыть файл, нет никаких причин, чтобы проверить, существует ли он первый. Файл может исчезнуть между проверкой и открытием, и в любом случае вам нужно будет проверить
os.Openошибки независимо от. Так что вы просто позвонитеos.IsNotExist(err)после того как вы попробовать чтобы открыть файл и разобраться с его несуществованием там (если это требует специальной обработки).[...] Вам не нужно проверять существующие пути вообще (и вы не должны).
os.MkdirAllработает независимо от того, существуют ли уже пути. (Также вам нужно проверить ошибку от этого вызова.)вместо
os.Create, вы должны использоватьos.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666). Таким образом, вы будете получите сообщение об ошибке, если файл уже существует. Также у этого нет состояния гонки с чем-то еще, создающим файл, в отличие от вашей версии, которая заранее проверяет наличие.взято из: https://groups.google.com/forum/#! msg / golang-nuts/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 }пример извлекается из здесь.
_, err := os.Stat(file) if err == nil { log.Printf("file %s exists", file) } else if os.IsNotExist(err) { log.Printf("file %s not exists", file) } else { log.Printf("file %s stat error: %v", file, err) }
The пример пользователя 11617 неверно; он сообщит, что файл существует даже в тех случаях, когда его нет, но произошла ошибка какого-то другого рода.
подпись должна быть 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 }
пример:
func file_is_exists(f string) bool { _, err := os.Stat(f) if os.IsNotExist(err) { return false } return err == nil }
давайте сначала рассмотрим несколько аспектов, как функция, предоставляемая
osпакетаgolangэто не утилиты, а проверки ошибок, что я имею в виду, это просто оболочка для обработки ошибок на кросс-платформе.так что в основном, если
os.StatЕсли эта функция не дает никаких ошибок, что означает, что файл существует, если вам нужно проверить, что это за ошибка, здесь идет использование этих двух функцийos.IsNotExistиos.IsExist.это может быть понимается как
Statошибки выброса файла, потому что он не существует или он бросает ошибку, потому что он существует, и с ним есть некоторые проблемы.параметр, который принимают эти функции, имеет тип
error, хотя вы могли бы передатьnil, но это не имело бы смысла.это также указывает на то, что
IsExist is not same as !IsNotExist, это две разные вещи.так что теперь, если вы хотите знать, если данный файл существует в go, я бы предпочитаю лучший способ:
if _, err := os.Stat(path/to/file); !os.IsNotExist(err){ //TODO }
Comments