std::filesystem::directory_entry::file_size

 
 
 
 
std::uintmax_t file_size() const;
std::uintmax_t file_size( std::error_code& ec ) const noexcept;
(C++17 起)

若文件大小缓存于此 directory_entry ,则返回缓存值。否则各返回 std::filesystem::file_size(path())std::filesystem::file_size(path(), ec)

参数

ec - 不抛出重载中报告错误的输出参数

返回值

所指代文件系统对象的大小

异常

不接受 std::error_code& 参数的重载在底层 OS API 错误时抛出 filesystem_error ,以第一 path 参数 p 和作为错误码参数的 OS 错误码构造。若 OS API 调用失败,则接受 std::error_code& 参数的重载设置该参数为 OS API 错误码,而若不出现错误则执行 ec.clear() 。若内存分配失败,则任何不标记为 noexcept 的重载可能抛出 std::bad_alloc

示例

以下程序以人类可读的形式打印出给定目录中的文件以及其大小。

#include <filesystem>
#include <iostream>
#include <cstdint>
#include <cmath>
 
struct HumanReadable {
    uintmax_t size {};
 
    template <typename Os> friend Os& operator<< (Os& os, HumanReadable hr)
    {
        int i{};
        double mantissa = hr.size;
        for (; mantissa >= 1024.; ++i) {
            mantissa /= 1024.;
        }
        mantissa = std::ceil(mantissa * 10.) / 10.;
        os << mantissa << "BKMGTPE"[i];
        return i == 0 ? os : os << "B (" << hr.size << ')';
    }
};
 
int main(int argc, const char* argv[])
{
    namespace fs = std::filesystem;
 
    const auto dir = argc == 2 ? fs::path { argv[1] } : fs::current_path();
 
    for (fs::directory_entry const& entry : fs::directory_iterator(dir)) {
        if (entry.is_regular_file()) {
            std::cout << entry.path().filename()
                      << " size: " << HumanReadable{entry.file_size()} << "\n";
        }
    }
}

可能的输出:

"boost_1_73_0.tar.bz2" size: 104.2MB (109247910)
"CppCon 2018 - Jon Kalb “Copy Elision”.mp4" size: 15.7MB (16411990)
"cppreference-doc-20190607.tar.xz" size: 6.3MB (6531336)
"hana.hpp" size: 6.7KB (6807)

参阅

(C++17)
返回文件的大小
(函数)