2012-05-09 12 views
84

Voglio verificare l'esistenza del file ./conf/app.ini nel mio codice Golang. Ma non riesco a trovare un buon modo per farlo.Come verificare se in Golang esiste un file o una directory denotata da un percorso?

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

Ma come si fa a Golang?

+0

Si sta inventando un altro parser ini per Go? Se sì, smetti di sprecare il tuo tempo e dai un'occhiata a https://github.com/vharitonsky/iniflags :) – valyala

+4

Inoltre, a seconda di come utilizzerai queste informazioni, avrai una condizione di gara. Tutto quello che puoi dire è che un po 'di tempo fa il file non esisteva; nel momento in cui agisci sul test, potrebbe essere vero il contrario. Di solito è molto meglio controllare mentre si fa qualsiasi operazione che si intende fare (es. Non controllare prima di aprire un esistente o creare un nuovo file, ma f, err: = os.Open (nome) 'o' f, err: = os.OpenFile (nome, os.O_CREATE | os.O_EXCL, modo) 'e quindi controlla' os.IsNotExist (err) '). –

risposta

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

A cura di aggiungere la gestione degli errori.

+4

Sembra a me "programmazione di eccezioni". C'è qualche risorsa che giustifichi questo tipo di codice come un paradigma #golang ufficiale? –

+0

@OlivierAmblet Ci scusiamo per la risposta tardiva. Cosa intendi con "questo tipo di codice"? Verifica dell'errore o cosa? – Mostafa

+16

@OlivierAmblet Qui non ci sono eccezioni. Go usa 'panic' per un vero oggetto di" eccezione ". Puoi "prendere" una chiamata a "recuperare".Restituire esplicitamente un errore come un secondo valore di ritorno è una tecnica Go estremamente comune e idiomatica. Vedi: http://golang.org/doc/effective_go.html#errors – Crisfole

90

È possibile utilizzare questo:

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

See: http://golang.org/pkg/os/#IsNotExist

+3

Questo è meglio della risposta accettata ma la clausola else è davvero necessaria? –

+6

@SergeyKoulikov Potrebbero esserci altri errori, come uno permesso. –

+1

@SergeyKoulikov Il modo giusto per mostrare il tuo apprezzamento per una risposta è con un upvote. Se le persone sono d'accordo con te che questa risposta è 'migliore', alla fine raggiungerà la cima e (probabilmente) diventerà la risposta accettata. – Alex

8

Più di una FYI, dal momento che ho 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 era la risposta più popolare nei miei risultati di ricerca, ma qui e altrove le soluzioni forniscono solo il controllo dell'esistenza. Per verificare se path rappresenta una directory esistente, ho scoperto che potevo 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 path/filepath pacchetto per contenere la funzione isdir().

0

Non c'è modo semplice per verificare se esiste il file o no:

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