kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
Reinstate Monica
Reinstate Monica
Вопрос

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

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

390 2012-09-20T18:42:02+00:00 8
Reinstate Monica
Reinstate Monica
Редактировал вопрос 21-го сентября 2012 в 8:13
Программирование
file
go
standard-library
Решение / Ответ
Reinstate Monica
Reinstate Monica
20-го сентября 2012 в 6:42
2012-09-20T18:42:02+00:00
Дополнительно
Источник
Редактировать
#17259113

Для проверки несуществования файла, эквивалентно 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

}
 colminator
colminator
Редактировал ответ 12-го января 2019 в 11:53
651
0
 OscarRyz
OscarRyz
18-го марта 2014 в 2:54
2014-03-18T14:54:36+00:00
Дополнительно
Источник
Редактировать
#17259117

Ответ Калеб запасной добавлено в [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

 NatNgs
NatNgs
Редактировал ответ 24-го июля 2017 в 1:03
115
0
Анонимный пользователь
21-го сентября 2012 в 9:10
2012-09-21T09:10:44+00:00
Дополнительно
Источник
Редактировать
#17259114

Вы должны использовать функции 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
}

Пример взят из здесь.

Afriza  N. Arief
Afriza N. Arief
Редактировал ответ 7-го февраля 2019 в 7:50
28
0
 user3431012
user3431012
17-го марта 2014 в 11:19
2014-03-17T23:19:38+00:00
Дополнительно
Источник
Редактировать
#17259116

Пример 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
}
Afriza  N. Arief
Afriza N. Arief
Редактировал ответ 7-го февраля 2019 в 7:41
16
0
 tangxinfa
tangxinfa
29-го июня 2017 в 2:58
2017-06-29T02:58:11+00:00
Дополнительно
Источник
Редактировать
#17259118
    _, 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)
    }
11
0
 honmaple
honmaple
11-го декабря 2017 в 5:51
2017-12-11T05:51:52+00:00
Дополнительно
Источник
Редактировать
#17259119

Пример функции:

func file_is_exists(f string) bool {
    _, err := os.Stat(f)
    if os.IsNotExist(err) {
        return false
    }
    return err == nil
}
6
0
Farhaan Bukhsh
Farhaan Bukhsh
18-го апреля 2018 в 6:47
2018-04-18T06:47:37+00:00
Дополнительно
Источник
Редактировать
#17259120

Позвольте's взглянуть на некоторые аспекты, во-первых, обе функции, представленной ОС пакет golang не ЖКХ, но ошибка в шашки, что я имею в виду, что они просто обертка для обработки ошибок на кросс-платформенность.

Так что в принципе если ОС.Стат, если эта функция не'т дать какие-либо ошибки, что означает, что файл существует, если это действительно вам нужно проверить, какие ошибки он, а вот использовать эти две функции операционной системы.IsNotExist и ОС.IsExist.

Это можно понимать как стат метания ошибка файла, потому что он не'т существует или это кидает ошибку, потому что он существует и есть некоторые проблемы с ним.

Параметр, что эти функции имеет тип ошибка, хотя вы могли бы быть в состоянии пройти ноль, но это не'т смысл.

Это также указывает на то, что IsExist не совпадает !IsNotExist, они как две разные вещи.

Так что теперь, если вы хотите знать, если существует определенный файл в Go, я бы предпочел лучшим способом является:

if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
   //TODO
} 
3
0
 ZuBsPaCe
ZuBsPaCe
4-го сентября 2019 в 3:24
2019-09-04T15:24:14+00:00
Дополнительно
Источник
Редактировать
#17259121

Какие еще ответы пропустил, это путь, чтобы функция на самом деле может быть каталог. Следующая функция позволяет убедиться, что путь действительно файла.

`` функция fileExists(имяфайла строка) типа bool { информация, подстраховались := ОС.Стат(именем) если ОС.IsNotExist(энр) { возвращает false } возвращение !информация.IsDir() }

``

Другая вещь, чтобы отметить: этот код может привести к состоянию гонки, где другой поток или процесс удаляет или создает заданный файл, в то время как функция fileExists работает.

Если вы'вновь переживал по этому поводу, использовать блокировку в ваши темы, сериализовать доступ к этой функции или использовать межпроцессное семафор, если задействованы разные приложения. Если задействованы другие приложения, вне вашего контроля, вы'вновь повезло, я думаю.

3
0
Похожие сообщества 9
Go-go!
Go-go!
7 326 пользователей
Thx @madgopher за лого! Флуд: @gogo_flood #book – книги #link – ccылки 🙅‍♀️: - оскорбления - nsfw контент - флуд, флейм и спам - избыток оффтоп тем - бесить людей Все мы были новичками. Вакансии: @gogetajob Главный стрелочник: @alek_si
Открыть telegram
Go Get A Job
Go Get A Job
3 741 пользователей
Филиал @gogolang Флудилка - https://t.me/+I6Q2M70UxdMyZDNi Предназначен для публикации вакансий, связанных с языком Go AKA Golang Правила постинга — в закреплённом сообщении Канал с вакансиями без общения @gogetajobfeed Тираны чатика те же :)
Открыть telegram
GOLANG Чат
GOLANG Чат
1 451 пользователей
Сообщество Go Программистов 🔴 Канал: @golang_org 🔴 Сайт: golangs.org 🔴 Форум: itfy.org Контакты: @python_user
Открыть telegram
Golang Telegram Bot API
Golang Telegram Bot API
1 124 пользователей
Discussion about the go-telegram-bot-api library. Please try to stay on topic. https://github.com/go-telegram-bot-api/telegram-bot-api https://go-telegram-bot-api.dev
Открыть telegram
Golang Jobs and Freelance
Golang Jobs and Freelance
1 075 пользователей
Discuss jobs and freelance for golang developers. If you have a job ad please contact @golangjob channel's admin. Вакансии в группе размещаются только через канал @golangjob. Все остальные будут удалены. Это делается в интересах соискателей.
Открыть telegram
Golang — вакансии и аналитика
1 023 пользователей
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
DE
ES
ID
JA
KO
PT
RO
RU
TR
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией