std::filesystem::file_size
Определён в заголовочном файле <filesystem> | ||
|---|---|---|
std::uintmax_t file_size( const std::filesystem::path& p ); | (1) | (начиная с C++17) |
std::uintmax_t file_size( const std::filesystem::path& p,
std::error_code& ec ) noexcept;
| (2) | (начиная с C++17) |
Если p не существует, сообщает об ошибке.
Для обычного файла p возвращает размер, определённый так, как если бы считывалось поле st_size структуры, полученной с помощью POSIX stat (символические ссылки разыменовываются).
Результат попытки определить размер каталога (а также любого другого файла, который не является обычным файлом или символической ссылкой) определяется реализацией.
Перегрузка, не выбрасывающая исключений, возвращает static_cast<std::uintmax_t>(-1) при ошибках.
Параметры
| p | - | путь для проверки |
| ec | - | выходной параметр для передачи сведений об ошибке в перегрузке, не выбрасывающей исключений |
Возвращаемое значение
Размер файла в байтах.
Исключения
Любая перегрузка, не помеченная noexcept, может выбросить std::bad_alloc при сбое выделения памяти.
std::filesystem::filesystem_error при ошибках базового API ОС; исключение создаётся с p в качестве первого аргумента пути и кодом ошибки ОС в качестве аргумента кода ошибки.std::error_code& код ошибки API ОС, если вызов API ОС завершается неудачно, и выполняет ec.clear(), если ошибок не возникает.Пример
#include <cmath>
#include <filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::filesystem;
struct HumanReadable
{
std::uintmax_t size{};
private:
friend std::ostream& operator<<(std::ostream& os, HumanReadable hr)
{
int o{};
double mantissa = hr.size;
for (; mantissa >= 1024.; mantissa /= 1024., ++o);
os << std::ceil(mantissa * 10.) / 10. << "BKMGTPE"[o];
return o ? os << "B (" << hr.size << ')' : os;
}
};
int main(int, char const* argv[])
{
fs::path example = "example.bin";
fs::path p = fs::current_path() / example;
std::ofstream(p).put('a'); // create file of size 1
std::cout << example << " size = " << fs::file_size(p) << '\n';
fs::remove(p);
p = argv[0];
std::cout << p << " size = " << HumanReadable{fs::file_size(p)} << '\n';
try
{
std::cout << "Attempt to get size of a directory:\n";
[[maybe_unused]] auto x_x = fs::file_size("/dev");
}
catch (fs::filesystem_error& e)
{
std::cout << e.what() << '\n';
}
for (std::error_code ec; fs::path bin : {"cat", "mouse"})
{
bin = "/bin"/bin;
if (const std::uintmax_t size = fs::file_size(bin, ec); ec)
std::cout << bin << " : " << ec.message() << '\n';
else
std::cout << bin << " size = " << HumanReadable{size} << '\n';
}
}
Возможный вывод:
"example.bin" size = 1 "./a.out" size = 22KB (22512) Attempt to get size of a directory: filesystem error: cannot get file size: Is a directory [/dev] "/bin/cat" size = 50.9KB (52080) "/bin/mouse" : No such file or directory
См. также
|
(C++17) | изменяет размер обычного файла путём усечения или заполнения нулями (функция) |
|
(C++17) | определяет доступное свободное место в файловой системе (функция) |
| возвращает размер файла, на который ссылается элемент каталога (открытая функция-член std::filesystem::directory_entry) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/file_size