Come verificare se esiste un file o una directory?


131

Voglio verificare l'esistenza del file ./conf/app.ininel mio codice Go, ma non riesco a trovare un buon modo per farlo.

So che esiste un metodo di File in Java: public boolean exists()che restituisce true se esiste il file o la directory.

Ma come si può fare in Go?


7
Nota anche che, a seconda di come utilizzerai queste informazioni, hai una condizione di gara. Tutto quello che puoi dire è che poco tempo fa il file non esisteva / non esisteva; prima di agire sul test, potrebbe essere vero il contrario. Di solito è molto meglio controllare mentre si fa qualsiasi operazione si intenda fare (ad esempio, non controllare prima di aprire un esistente o creare un nuovo file ma fare f, err := os.Open(name)o f, err := os.OpenFile(name,os.O_CREATE|os.O_EXCL, mode)e quindi controllare os.IsNotExist(err)).
Dave C,

Risposte:


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
}

Modificato per aggiungere la gestione degli errori.


4
Mi sembra una "programmazione delle eccezioni". C'è qualche risorsa che giustifica questo tipo di codice come paradigma ufficiale #golang?
Olivier Amblet,

21
@OlivierAmblet Non ci sono eccezioni qui. Go utilizza panicper una vera "eccezione" come l'oggetto. Puoi "catturare" con una chiamata a recover. errRestituire esplicitamente un come secondo valore restituito è una tecnica Go estremamente idiomatica molto comune. Vedi: golang.org/doc/effective_go.html#errors
Chris Pfohl

13
la soluzione non è molto semplice, vai è speciale
zhaozhi,

1
È vero che non esiste una funzione booleana Esistenti, ma il codice dell'applicazione può essere più semplice se si desidera verificare solo l'esistenza di un file:if _, err := os.Stat("./conf/app.ini"); err == nil { /*exists*/ } else { /*not exists or some other error*/ }
Tobia,

11
Perché tutto in questa lingua è così complicato?
Top Cat,


22

Più che altro, visto che mi sono guardato intorno per qualche minuto pensando che la mia domanda fosse una rapida ricerca.

Come verificare se il percorso rappresenta una directory esistente in Go?

Questa è stata la risposta più popolare nei miei risultati di ricerca, ma qui e altrove le soluzioni forniscono solo un controllo dell'esistenza. Per verificare se pathrappresenta una directory esistente, ho scoperto che potrei facilmente:

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

Parte del mio problema era che mi aspettavo che il path/filepathpacchetto contenga la funzione isDir ().



-2

C'è un modo semplice per verificare se il tuo file esiste o meno:

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

Questo è un duplicato della risposta di Denys Séguret.
StardustGogeta,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.