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 w directory_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';
}
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';
}