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



стандартная библиотека Go не имеет функции, предназначенной исключительно для проверки того, существует ли файл или нет (например, Python os.path.exists). Что такое идиоматическое как это сделать?

1466   7  

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.Stat is достаточно легко для тех случаев, когда это требуется.

[... Например: если вы собираетесь открыть файл, нет никаких причин, чтобы проверить, существует ли он первый. Файл может исчезнуть между проверкой и открытием, и в любом случае вам нужно будет проверить 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

    Ничего не найдено.