causa C++ è anche etichettato, userei boost::filesystem
:
#include <boost/filesystem.hpp>
bool FileExist(const std::string& Name)
{
return boost::filesystem::exists(Name);
}
Dietro le quinte
A quanto pare, spinta sta usando stat
su POSIX e DWORD attr(::GetFileAttributesW(FileName));
su Windows (Nota: I ho estratto qui le parti rilevanti del codice, potrebbe essere che ho fatto qualcosa di sbagliato, ma dovrebbe essere così).
Fondamentalmente, oltre al valore di ritorno, boost sta controllando il valore di errno per verificare se il file non esiste realmente o se la tua statistica non è riuscita per un motivo diverso.
#ifdef BOOST_POSIX_API
struct stat path_stat;
if (::stat(p.c_str(), &path_stat)!= 0)
{
if (ec != 0) // always report errno, even though some
ec->assign(errno, system_category()); // errno values are not status_errors
if (not_found_error(errno))
{
return fs::file_status(fs::file_not_found, fs::no_perms);
}
if (ec == 0)
BOOST_FILESYSTEM_THROW(filesystem_error("boost::filesystem::status",
p, error_code(errno, system_category())));
return fs::file_status(fs::status_error);
}
#else
DWORD attr(::GetFileAttributesW(p.c_str()));
if (attr == 0xFFFFFFFF)
{
int errval(::GetLastError());
if (not_found_error(errval))
{
return fs::file_status(fs::file_not_found, fs::no_perms);
}
}
#endif
not_found_error
viene definito separatamente per Windows e per POSIX:
di Windows:
bool not_found_error(int errval)
{
return errval == ERROR_FILE_NOT_FOUND
|| errval == ERROR_PATH_NOT_FOUND
|| errval == ERROR_INVALID_NAME // "tools/jam/src/:sys:stat.h", "//foo"
|| errval == ERROR_INVALID_DRIVE // USB card reader with no card inserted
|| errval == ERROR_NOT_READY // CD/DVD drive with no disc inserted
|| errval == ERROR_INVALID_PARAMETER // ":sys:stat.h"
|| errval == ERROR_BAD_PATHNAME // "//nosuch" on Win64
|| errval == ERROR_BAD_NETPATH; // "//nosuch" on Win32
}
POSIX:
bool not_found_error(int errval)
{
return errno == ENOENT || errno == ENOTDIR;
}
fonte
2013-08-19 18:29:11
Qual è lo scopo di verificare se esiste, per esempio hai intenzione di aprire il file se esiste, o di stampare un messaggio di errore, o qualcos'altro? –
Dovrebbe funzionare bene. Verifico specificamente sia per Windows che per POSIX con l'impostazione predefinita come qualcosa di POSIX. Probabilmente si dovrebbe definire anche un sistema operativo specifico per il progetto, poiché questi stessi nomi potrebbero cambiare da sistema a sistema. – Jiminion
@MatsPetersson: stampare un messaggio di errore è uno dei casi da utilizzare. –