Як перевірити, чи існує файл чи каталог?


131

Я хочу перевірити наявність файлу ./conf/app.iniв моєму коді Go, але я не можу знайти хороший спосіб зробити це.

Я знаю, що існує метод File на Java:, public boolean exists()який повертає true, якщо файл або каталог існує.

Але як це можна зробити в Go?


7
Також зауважте, що залежно від того, як ви будете використовувати цю інформацію, ви маєте умови перегонів. Все, що ви можете сказати, - це те, що трохи раніше файл існував / не існував; до моменту, коли ви будете діяти на тест, може бути правдивим. Зазвичай це набагато краще перевірити, виконуючи будь-яку операцію, яку ви плануєте зробити (наприклад, не перевіряйте перед відкриттям існуючого або створення нового файлу, але зробіть f, err := os.Open(name)або, f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)а потім перевірте os.IsNotExist(err)).
Дейв C

Відповіді:


189
// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
    _, err := os.Stat(path)
    if err == nil { return true, nil }
    if os.IsNotExist(err) { return false, nil }
    return false, err
}

Відредаговано, щоб додати обробку помилок.


4
Мені це здається "програмуванням виключень". Чи є якийсь ресурс, який виправдовує такий код як офіційну парадигму #golang?
Олів'є Амблет

21
@OlivierAmblet Тут не відбувається виняток. Go використовує panicфактичний об'єкт типу "виняток". Ви можете «зловити» за допомогою дзвінка на recover. Явне повернення errяк другого значення повернення є надзвичайно поширеною, ідіоматичною технікою Go. Дивіться: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
рішення не дуже пряме, перехід особливий
джаожі

1
Це правда, що булева функція Exists не існує, але код програми може бути простішим, якщо ви хочете лише перевірити наявність файлу:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
Чому все на цій мові так складно?
Топ Кіт

123

Ви можете скористатися цим:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        // file does not exist
    } else {
        // other error
    }
}

Дивіться: http://golang.org/pkg/os/#IsNotExist


6
Це краще, ніж прийнята відповідь, але чи справді необхідне застереження?
Сергій Куліков

9
@SergeyKoulikov Можуть бути й інші помилки, як, наприклад, дозвіл.
Denys Séguret

22

Більше FYI, оскільки я озирнувся кілька хвилин, думаючи, що моє питання буде швидким пошуком.

Як перевірити, чи шлях представляє існуючий каталог у Go?

Це була найпопулярніша відповідь у моїх результатах пошуку, але тут і в інших місцях рішення забезпечують лише перевірку існування. Щоб перевірити, чи pathявляє собою існуючий каталог, я легко знайшов:

path := GetSomePath();
if stat, err := os.Stat(path); err == nil && stat.IsDir() {
    // path is a directory
}

Частиною моєї проблеми було те, що я очікував, що path/filepathпакет містить функцію isDir ().



-2

Існує простий спосіб перевірити, чи існує ваш файл чи ні:

if _, err := os.Stat("./conf/app.ini"); err != nil {
    if os.IsNotExist(err) {
        ..... //Shows error if file not exists
    } else {
       ..... // Shows success message like file is there
    }
}

Це дублікат відповіді Дениса Сегурета.
StardustGogeta
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.