Ponieważ C++ jest również określili, że użyłby boost::filesystem
:
#include <boost/filesystem.hpp>
bool FileExist(const std::string& Name)
{
return boost::filesystem::exists(Name);
}
za kulisami
Najwyraźniej doładowania jest z wykorzystaniem stat
na POSIX i DWORD attr(::GetFileAttributesW(FileName));
w systemie Windows (uwaga: "Wyodrębniłem tutaj odpowiednie części kodu, może się zdarzyć, że zrobiłem coś złego, ale to powinno być to).
Zasadniczo, oprócz wartości zwracanej, boost sprawdza wartość errno, aby sprawdzić, czy plik naprawdę nie istnieje, lub czy twoja stata nie powiodła się z innego powodu.
#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
jest definiowany osobno dla Windows i dla POSIX:
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;
}
Co jest celem sprawdzenia, czy istnieje, na przykład czy otworzysz plik, jeśli istnieje, czy wydrukujesz komunikat o błędzie lub coś innego? –
Powinno działać dobrze. W szczególności sprawdziłbym zarówno dla systemu Windows, jak i dla POSIX, z domyślną wartością podobną do POSIX. Prawdopodobnie powinieneś również zdefiniować system operacyjny dla konkretnego projektu, ponieważ same te nazwy mogą się zmieniać z systemu na system. – Jiminion
@MatsPetersson: drukowanie komunikatu o błędzie jest jednym z przypadków użycia. –