Ho un fstream my_file ("test.txt"), ma non so se esiste test.txt. Nel caso esista, vorrei sapere se posso leggerlo anche io. Come farlo?Come verificare se un file esiste ed è leggibile in C++?
Io uso Linux.
Ho un fstream my_file ("test.txt"), ma non so se esiste test.txt. Nel caso esista, vorrei sapere se posso leggerlo anche io. Come farlo?Come verificare se un file esiste ed è leggibile in C++?
Io uso Linux.
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.
In questo modo non solo si verifica se esiste ed è leggibile, in realtà lo si apre. – xtofl
Sì, è vero. Ho letto la domanda dell'OP che il file era già aperto, ma potrei sbagliarmi. –
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.
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.
access() è un ottimo modo per introdurre bug di time-of-time-of-use. – bk1e
È 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.
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. –
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. –
@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. –
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
}
Ho riscontrato che PathFileExists() non è affidabile: http://mfctips.com/tag/file-exists/ –
Poiché C++ 11 è possibile utilizzare implicita operator bool anziché good()
:
ifstream my_file("test.txt");
if (my_file) {
// read away
}
Dove si trova "possibile duplicato". Mi chiedo se i bambini dei nostri figli porranno questa domanda? – SChepurin