最終更新日時: 2025年07月09日 00時33分39秒 (JST)
Akira Takahashi が更新

履歴 編集

function
<filesystem>

# std::filesystem::resize_file(C++17)

    namespace std::filesystem {
      void resize_file(const path& p, std::uintmax_t new_size);                               // (1)
      void resize_file(const path& p, std::uintmax_t new_size, std::error_code& ec) noexcept; // (2)
    }

## 概要

ファイルサイズを変更する。

## 効果

- ファイル`p`の大きさを、`new_size`バイトに変更する。
  - POSIX環境では、`truncate()`関数を使用する

## 例外

- (1) : ファイルシステムがエラーを報告する場合がある。それに加えて、ファイルが存在しない場合はエラーである。エラーが発生した場合は、`std::filesystem::filesystem_error` 例外を送出する
- (2) : 投げない

## 備考

- POSIX環境では、ファイルサイズを縮小する場合は末尾のデータが切り詰められる。ファイルサイズを伸長する場合は延ばした領域がヌルバイト (`'\0'`) で埋められる
- 通常ファイル (とそのファイルへのシンボリックリンク) 以外に対してこの関数を実行した場合の動作は未規定

## 例

    #include <cassert>
    #include <fstream>
    #include <filesystem>

    namespace fs = std::filesystem;

    int main()
    {
      // 4バイトのファイルを作る
      {
        std::ofstream file{"regular.txt", std::ios::binary};
        std::uint32_t value = 42;
        file.write(reinterpret_cast<char*>(&value), sizeof(value));
      }

      // 8バイトに伸長
      fs::resize_file("regular.txt", 8);
      assert(fs::file_size("regular.txt") == 8);

      // 4バイトに縮小
      fs::resize_file("regular.txt", 4);
      assert(fs::file_size("regular.txt") == 4);
    }

### 出力

## バージョン

### 言語

- C++17

### 処理系

- Clang: 7.0 ✅
- GCC: 8.1 ✅
- Visual C++:

## 参照

- LWG Issue 2816. `resize_file` has impossible postcondition