Cum pentru a verifica dacă un fișier există în Drumul?

Du-te's biblioteca standard nu are o funcție exclusiv în scopul de a verifica dacă un fișier există sau nu (cum ar fi Python's os.calea.există). Ce este idiomatice cum să o faci?

Comentarii la întrebare (5)
Soluția

Pentru a verifica dacă un fișier nu't există, echivalent cu Python's dacă nu sistemul de operare.calea.există(filename):

if _, err := os.Stat("/path/to/whatever"); os.IsNotExist(err) {
  // path/to/whatever does not exist
}

Pentru a verifica dacă un fișier există, echivalent cu Python's dacă sistemul de operare.calea.există(filename):

Editat: pe comentarii recente

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

}
Comentarii (4)

Raspuns de Caleb Rezervă postat în gonuts lista de corespondență.

[...] L's, de fapt, nu este necesar de foarte multe ori și [...] folosind os.Stat este destul de ușor pentru cazurile în care este necesar.

[...] De exemplu: dacă aveți de gând pentru a deschide fișierul, acolo's nici un motiv pentru a verifica dacă există prima. Fișierul ar putea dispărea între verificarea și deschidere, și oricum te'll nevoie pentru a verifica os.Deschide eroare indiferent. Așa că pur și simplu apel os.IsNotExist(err) după ce-l încercați pentru a deschide fișierul, și să se ocupe cu non-existența nu există (în cazul în care necesită o manipulare specială).

[...] nu't nevoie pentru a verifica pentru drumurile existente la toate (și nu ar trebui't).

  • os.MkdirAll funcționează indiferent dacă sunt sau nu căi există deja. (De asemenea, aveți nevoie pentru a verifica eroarea din acel apel.)
  • în Loc de a folosi os.Crea, ar trebui să utilizați os.OpenFile(cale, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666) . Așa te'll obține o eroare dacă fișierul există deja. De asemenea, aceasta nu't au o condiție cursă cu altceva face dosarul, spre deosebire de versiunea care verifică existența în prealabil.

Preluat de pe: https://groups.google.com/forum/#!msg/golang-nuci/Ayx-BMNdMFo/4rL8FFHr8v4J

Comentarii (0)

Ar trebui să utilizați os.Stat () " și " sistem de operare.IsNotExist() funcții ca în următorul exemplu:

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

De exemplu este extras din aici.

Comentarii (1)

De exemplu, prin user11617 este incorectă; se va raporta că fișierul există chiar și în cazurile în care nu, dar a existat o eroare de un alt fel.

Semnătura trebuie să fie Există(string) (bool, eroare). Și apoi, așa cum se întâmplă, apelul site-uri sunt mai bune.

Codul scris de el ar mai fi:

func Exists(name string) bool {
    _, err := os.Stat(name)
    return !os.IsNotExist(err)
}

Dar eu sugerez acest loc:

func Exists(name string) (bool, error) {
  _, err := os.Stat(name)
  if os.IsNotExist(err) {
    return false, nil
  }
  return err != nil, err
}
Comentarii (3)
    _, 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)
    }
Comentarii (0)

Funcția exemplu:

func file_is_exists(f string) bool {
    _, err := os.Stat(f)
    if os.IsNotExist(err) {
        return false
    }
    return err == nil
}
Comentarii (1)

Las's se uite la câteva aspecte în primul rând, atât funcția oferite de os pachet de golang nu sunt utilități, dar de eroare joc de dame, ce vreau să spun cu asta este că sunt doar un wrapper să se ocupe de erori pe cross-platform.

Deci, practic, dacă os.Stat, dacă această funcție nu't da nici o eroare asta înseamnă că fișierul este deja existente, dacă nu aveți nevoie pentru a verifica ce fel de eroare este, aici vine folosi de aceste două funcții os.IsNotExist și sistem de operare.IsExist.

Acest lucru poate fi înțeles ca Stat de fișierul aruncat de eroare pentru că nu't există sau este aruncat de eroare pentru că a existat și există unele probleme cu ea.

Parametrul care aceste funcții să ia este de tip eroare, deși s-ar putea fi capabil să treacă zero, dar nu't sens.

Acest lucru, de asemenea, subliniază faptul că IsExist nu este de același fel !IsNotExist, sunt două lucruri diferite.

Deci, acum, dacă vrei să știi dacă un anumit fișier există, dar aș prefera cel mai bun mod este:

if _, err := os.Stat(path/to/file); !os.IsNotExist(err){
   //TODO
} 
Comentarii (0)

Ce alte răspunsuri ratat, asta e calea pentru funcția ar putea fi de fapt un director. Următoarea funcție face sigur, că drumul este într-adevăr un fișier.

`` func fileExists(filename string) bool { informatii, err := os.Stat(filename) dacă sistemul de operare.IsNotExist(err) { return false } reveni !info.IsDir() }

``

Un alt lucru pe care să-l subliniez: Acest cod ar putea conduce la o condiție de rulare, în cazul în care un alt fir sau proces șterge sau creează fișierul specificat, în timp ce fileExists funcția se execută.

Daca're îngrijorat de acest lucru, utilizați un sistem de blocare în fire, căreia îi dau acces la această funcție sau de a folosi un inter-proces semafor dacă mai multe aplicații sunt implicate. Dacă alte aplicații sunt implicate, în afara controlului tău, te're de noroc, cred.

Comentarii (0)