2009-10-30 13 views
28

Voglio aprire un file per la lettura. Tuttavia, nel contesto di questo programma, è OK se il file non esiste, mi basta andare avanti. Voglio essere in grado di identificare quando l'errore è "file non trovato" e quando l'errore è diverso. Altrimenti significa che ho bisogno di uscire e di errore.ifstream: come sapere se il file specificato non esiste

Non vedo un modo ovvio per farlo con fstream.


posso fare questo con di C open() e perror(). Presumo che ci fosse un modo fstream per fare anche questo.

risposta

5

Poiché il risultato della apertura di un file è specifico per OS, non lo faccio penso che lo standard C++ abbia modo di differenziare i vari tipi di errori. Il file si apre o no.

Si può provare ad aprire il file per la lettura, e se non si apre, si sa che non esiste o si è verificato qualche altro errore. Poi di nuovo, se provi ad aprirlo per scrivere in seguito e fallisce, potrebbe rientrare nella categoria "qualcos'altro".

36

Non penso che tu possa sapere se "il file non esiste". Si potrebbe usare is_open() per il controllo generico:

ofstream file(....); 
if(!file.is_open()) 
{ 
    // error! maybe the file doesn't exist. 
} 

Se si utilizza boost si potrebbe usare boost::filesystem:

#include <boost/filesystem.hpp> 
int main() 
{ 
    boost::filesystem::path myfile("test.dat"); 

    if(!boost::filesystem::exists(myfile)) 
    { 
     // what do you want to do if the file doesn't exist 
    } 
} 
+6

non è distream ma ifstream! – Phong

+0

Nota che entrambi i modi controllano qualcos'altro: il file potrebbe essere lì ma potresti non disporre delle autorizzazioni necessarie ... – rubenvb

+3

Non è una soluzione intrinsecamente audace? –

5

È possibile utilizzare stat, che dovrebbe essere portabile su più piattaforme ed è nella libreria standard C:

#include <sys/stat.h> 

bool FileExists(string filename) { 
    struct stat fileInfo; 
    return stat(filename.c_str(), &fileInfo) == 0; 
} 

Se stat restituisce 0, il file (o directory) esiste, altrimenti non lo fa. Suppongo che dovrai avere i permessi di accesso su tutte le directory nel percorso del file. Non ho provato la portabilità, ma this page suggerisce che non dovrebbe essere un problema.

+0

È consigliabile verificare esplicitamente il codice di ritorno, in quanto potrebbe essere diverso da zero per motivi diversi dal file inesistente. Vedi http://pubs.opengroup.org/onlinepubs/009695399/functions/stat.html – gerardw

+2

Questa è una cosa SBAGLIATA da fare, perché durante il tempo DOPO stat() restituito e PRIMA di 'fstream''s open() ha ottenuto in realtà aprendo un file il file potrebbe essere già andato (cancellato da un altro processo nel sistema). – PowerGamer

+0

http://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c – Ethan

39

EDIT: Mi è stato notificato che questo non indica necessariamente che un file non esiste, in quanto potrebbe essere contrassegnato a causa di autorizzazioni di accesso o altri problemi.

So che sono molto in ritardo nel rispondere a questa domanda, ma ho pensato di lasciare comunque un commento per chiunque stia navigando. È possibile utilizzare l'indicatore di fail di ifstream per determinare se esiste un file.

ifstream myFile("filename.txt"); 
    if(myFile.fail()){ 
     //File does not exist code here 
    } 
//otherwise, file exists 
+2

Grazie per la risposta "tarda"! Sono stato davvero utile a postarlo;) – ezdazuzena

+0

Molto utile! Grazie mille –

+2

Quello che suggerisci NON è un modo per cercare "file non trovato". 'fail()' non indica che "il file non esiste", indica semplicemente "qualcosa non va". Nel tuo esempio specifico può essere "accesso negato" o "violazione della condivisione" ecc. – PowerGamer

0

La funzione restituisce std::fstream::good()false quando il file non esiste. Non è abbastanza?

std::fstreameredita questa funzione da std::ios.