Bir dosya veya dizinin mevcut olup olmadığı nasıl kontrol edilir?


131

./conf/app.iniGo kodumdaki dosyanın varlığını kontrol etmek istiyorum , ancak bunu yapmanın iyi bir yolunu bulamıyorum.

Java'da bir Dosya yöntemi olduğunu biliyorum:, public boolean exists()dosya veya dizin varsa true döndürür.

Ama bu Go'da nasıl yapılabilir?


7
Ayrıca, bu bilgiyi nasıl kullanacağınıza bağlı olarak bir yarış durumunuzun olduğunu da unutmayın. Söyleyebileceğiniz tek şey, dosyanın bir süre önce var olduğu / olmadığı; testte hareket ettiğinizde bunun tersi doğru olabilir. Genellikle yapmak istediğiniz işlemi yaparken kontrol etmek çok daha iyidir (örneğin var olan bir dosyayı açmadan veya yeni bir dosya oluşturmadan önce kontrol etmeyin ama yapın f, err := os.Open(name)veya f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)sonra kontrol edin os.IsNotExist(err)).
Dave C

Yanıtlar:


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
}

Hata işleme eklemek için düzenlendi.


4
Bana 'istisna programlama' gibi görünüyor. Bu tür bir kodu resmi bir #golang paradigması olarak doğrulayan herhangi bir kaynak var mı?
Olivier Amblet

21
@OlivierAmblet Burada herhangi bir istisna yoktur. Go, panicgerçek bir "istisna" benzeri nesne için kullanır . Bir çağrı ile "yakalayabilirsiniz" recover. errBir ikinci dönüş değeri olarak açıkça döndürmek son derece yaygın, deyimsel bir Go tekniğidir. Bakınız: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
çözüm çok zor değil, gitmek özel
zhaozhi

1
Boolean Exists işlevi olmadığı doğrudur, ancak yalnızca bir dosyanın varlığını kontrol etmek istiyorsanız uygulama kodu daha basit olabilir:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia

11
Bu dildeki her şey neden bu kadar karmaşık?
Top Cat


22

Daha çok bilgi için, birkaç dakika etrafıma baktığımdan beri sorumun hızlı bir arama uzaklıkta olduğunu düşündüm.

Yolun Go'da var olan bir dizini temsil edip etmediği nasıl kontrol edilir?

Bu, arama sonuçlarımdaki en popüler cevaptı, ancak burada ve başka yerlerde çözümler yalnızca mevcudiyet kontrolü sağlar. pathMevcut bir dizini temsil edip etmediğini kontrol etmek için kolayca yapabileceğimi fark ettim:

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

path/filepathSorunumun bir kısmı, paketin isDir () işlevini içermesini beklememdi.



-2

Dosyanızın var olup olmadığını kontrol etmenin basit bir yolu vardır:

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
    }
}

Bu, Denys Séguret'ün cevabının bir kopyasıdır.
StardustGogeta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.