2009-09-05 13 views

risposta

80

Io probabilmente andare con:

ifstream my_file("test.txt"); 
if (my_file.good()) 
{ 
    // read away 
} 

I controlli good metodo se il flusso è pronto per essere letto da.

+12

In questo modo non solo si verifica se esiste ed è leggibile, in realtà lo si apre. – xtofl

+1

Sì, è vero. Ho letto la domanda dell'OP che il file era già aperto, ma potrei sbagliarmi. –

10

Quale sistema operativo/piattaforma?

Su Linux/Unix/MacOSX, è possibile utilizzare fstat.

Su Windows, è possibile utilizzare GetFileAttributes.

Di solito, non esiste un modo portatile per farlo con le funzioni standard di C/C++ IO.

+1

Perché dici così, puoi sempre provare ad aprire un file con fopen e se restituisce 0 puoi dedurre che il file è inesistente. – Blindy

+1

fstat è disponibile anche in Windows, in 'sys/stat.h'. – xtofl

8

se si è su unix, quindi access() può dire se è leggibile. Tuttavia, se le ACL sono in uso, diventa più complicato, in questo caso è meglio aprire il file con ifstream e provare a leggere .. se non si riesce a leggere l'ACL può proibire la lettura.

+1

access() è un ottimo modo per introdurre bug di time-of-time-of-use. – bk1e

23

È possibile utilizzare Boost.Filesystem. Ha una funzione boost::filesystem::exist.

Non so come controllare i diritti di accesso in lettura. Puoi anche cercare in Boost.Filesystem. Tuttavia, probabilmente non ci sarà altro modo (portatile) di provare a leggere effettivamente il file.

+0

Il filesystem boost gestisce percorsi molto lunghi su windows (> 256)? Di recente abbiamo riscontrato il problema che l'API Windows non unicode ha un massimo di 256 caratteri. –

+0

Non lo so. Si potrebbe verificare nella documentazione (al link nella mia risposta), ma non sono sicuro se lo troverete e il suo lungo. Potresti anche chiedere al gruppo di notizie Boost. Un altro modo è semplicemente controllarlo. –

+0

@Richard Corden Ho controllato percorsi molto lunghi con function boost :: filesystem :: create_directories. La versione ANSI (per char) ha lanciato un'eccezione se assegnata al percorso lungo (ma il limite è stato in qualche modo raggiunto intorno a 250 anziché MAX_PATH che è uguale a 260). La versione UNICODE (per wchar_t) ha creato tutte le cartelle della versione ANSI senza il lancio e ha restituito correttamente, quindi non solo non ha funzionato, ma non ha segnalato l'errore. Non so come sia con altre funzioni, ma sospetto che ora potrebbero comportarsi male. –

0

Per quanto riguarda l'uso di fstat in Windows, non sono sicuro che sia quello che vuoi. Da Microsoft il file deve essere già aperto. Stat dovrebbe funzionare per voi.

2

So che il poster alla fine ha detto che stavano usando Linux, ma sono piuttosto sorpreso che nessuno abbia menzionato la chiamata all'API PathFileExists() per Windows.

È necessario includere la libreria Shlwapi.lib e il file di intestazione Shlwapi.h.

#pragma comment(lib, "shlwapi.lib") 
#include <shlwapi.h> 

la funzione restituisce un valore BOOL e può essere richiamata in questo modo:

if(PathFileExists("C:\\path\\to\\your\\file.ext")) 
{ 
    // do something 
} 
+0

Ho riscontrato che PathFileExists() non è affidabile: http://mfctips.com/tag/file-exists/ –

3

Poiché C++ 11 è possibile utilizzare implicita operator bool anziché good():

ifstream my_file("test.txt"); 
if (my_file) { 
    // read away 
} 
Problemi correlati