Czy istnieją pułapki związane z określonymi systemami operacyjnymi, o których powinienem wiedzieć?
Istnieje wiele duplikatów ( 1 , 2 , 3 , 4 , 5 ) tego pytania, ale odpowiedź na nie została udzielona dziesiątki lat temu. Bardzo wysoko ocenione odpowiedzi na wiele z tych pytań są dziś błędne.
Metody z innych (starych QA) na .sx
stat.h (wrapper sprintstatf ), używa syscall
tellg () , zwraca zgodnie z definicją pozycję, ale niekoniecznie bajty . Zwracany typ nie jest
int
.
c++
c++17
filesize
c++-standard-library
Jonas Stein
źródło
źródło
tellg
problemy. Jedynym, którym warto się przejmować, jest czwarty, a ten nie jest wielki, bo o nim za dużo mówiofstream
, zarówno w pytaniu, jak i odpowiedziach. Ten jest o wiele lepszy w wyrażaniu intencji niż inne (z wyjątkiem pierwszego, który jest dziwnie zamknięty).stat(2)
ogóle jest nie tak? Za stary czy co?stat(2)
To nie jest częścią standardu językowego.Odpowiedzi:
<filesystem>
(dodane w C ++ 17) czyni to bardzo prostym .#include <cstdint> #include <filesystem> // ... std::uintmax_t size = std::filesystem::file_size("c:\\foo\\bar.txt");
Jak zauważono w komentarzach, jeśli planujesz użyć tej funkcji, aby zdecydować, ile bajtów odczytać z pliku, pamiętaj, że ...
źródło
std::uintmax_t
będzie można zachować większe wartości niżstd::size_t
? Jeśli nie, dlaczego nie użyćstd::size_t
, co prawdopodobnie jest bardziej rozpoznawalne? +1 w odpowiedzi, przy okazjifile_size
zwraca. Dla mnie też wygląda trochę dziwnie.std::size_t
jest wymagane tylko do przechowywania maksymalnego rozmiaru w obiektach pamięci. Pliki mogą być znacznie większe,size_t
ma 32 bity iuintmax_t
64 bity.C ++ 17 zapewnia,
std::filesystem
co usprawnia wiele zadań na plikach i katalogach. Nie tylko możesz szybko uzyskać rozmiar pliku, jego atrybuty, ale także tworzyć nowe katalogi, iterować pliki, pracować z obiektami ścieżek.Nowa biblioteka daje nam dwie funkcje, z których możemy skorzystać:
std::uintmax_t std::filesystem::file_size( const std::filesystem::path& p ); std::uintmax_t std::filesystem::directory_entry::file_size() const;
Pierwsza funkcja to funkcja wolna w programie
std::filesystem
, druga to metoda wdirectory_entry
.Każda metoda ma również przeciążenie, ponieważ może zgłosić wyjątek lub zwrócić kod błędu (za pośrednictwem parametru wyjściowego). Poniżej znajduje się szczegółowy kod wyjaśniający wszystkie możliwe przypadki.
#include <chrono> #include <filesystem> #include <iostream> namespace fs = std::filesystem; int main(int argc, char* argv[]) { try { const auto fsize = fs::file_size("a.out"); std::cout << fsize << '\n'; } catch (const fs::filesystem_error& err) { std::cerr << "filesystem error! " << err.what() << '\n'; if (!err.path1().empty()) std::cerr << "path1: " << err.path1().string() << '\n'; if (!err.path2().empty()) std::cerr << "path2: " << err.path2().string() << '\n'; } catch (const std::exception& ex) { std::cerr << "general exception: " << ex.what() << '\n'; } // using error_code std::error_code ec{}; auto size = std::filesystem::file_size("a.out", ec); if (ec == std::error_code{}) std::cout << "size: " << size << '\n'; else std::cout << "error when accessing test file, size is: " << size << " message: " << ec.message() << '\n'; }
źródło