Przeczytałem odpowiedzi na temat Jak najlepiej sprawdzić, czy plik istnieje w C? (wiele platform) , ale zastanawiam się, czy istnieje lepszy sposób na zrobienie tego przy użyciu standardowych bibliotek C ++? Najlepiej bez próby otwarcia pliku.
Obydwa stat
i access
są prawie niemożliwe do usunięcia. Czego mam #include
ich używać?
Odpowiedzi:
Użyj boost :: filesystem :
źródło
Uważaj na warunki wyścigu: jeśli plik zniknie między sprawdzeniem „istnieje” a momentem jego otwarcia, program nieoczekiwanie zakończy się niepowodzeniem.
Lepiej jest iść i otworzyć plik, sprawdzić, czy nie ma awarii i jeśli wszystko jest w porządku, zrób coś z plikiem. Jest to jeszcze ważniejsze w przypadku kodu krytycznego dla bezpieczeństwa.
Szczegóły dotyczące bezpieczeństwa i warunków wyścigu: http://www.ibm.com/developerworks/library/l-sprace.html
źródło
Jestem szczęśliwym użytkownikiem doładowania i na pewno skorzystałbym z rozwiązania Andreasa. Ale jeśli nie masz dostępu do bibliotek boost, możesz użyć biblioteki strumieniowej:
To nie jest tak przyjemne, jak boost :: filesystem :: istnieje, ponieważ plik zostanie faktycznie otwarty ... ale to zwykle jest następna rzecz, którą chcesz zrobić.
źródło
Użyj stat (), jeśli jest wystarczająco wieloplatformowy dla twoich potrzeb. Nie jest to jednak standard C ++, ale POSIX.
W MS Windows jest _stat, _stat64, _stati64, _wstat, _wstat64, _wstati64.
źródło
A co powiesz
access
?źródło
Inna możliwość polega na wykorzystaniu
good()
funkcji w strumieniu:źródło
Zastanowiłbym się ponownie, próbując dowiedzieć się, czy plik istnieje. Zamiast tego powinieneś spróbować otworzyć go (w Standard C lub C ++) w tym samym trybie, w którym zamierzasz go używać. Jaki pożytek to wiedzieć, że plik istnieje, jeśli, powiedzmy, nie można go zapisać, kiedy trzeba go użyć?
źródło
ls
podobny program? Domyślam się, że oryginalny plakat w ogóle nie chce otwierać pliku. Funkcja stat Posix ma jednak dostarczać informacji o uprawnieniach do pliku, więc rozwiązałaby ten problem.Jeśli Twój kompilator obsługuje C ++ 17, nie potrzebujesz przyspieszenia, możesz po prostu użyć
std::filesystem::exists
źródło
NIE podnieśćWYMAGANE , co byłoby przesadą .
Użyj stat () (nie cross platform, jak wspomniano w pavon), na przykład:
Wynik:
Kolejną wersję (i tę) można znaleźć tutaj .
źródło
Jeśli używasz już klasy stream pliku wejściowego (
ifstream
), możesz użyć jej funkcjifail()
.Przykład:
źródło