# std::filesystem::directory_entry::file_size

< cpp‎ | filesystem‎ | directory entry

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)

### 参阅

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