std::experi...resize_file(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– std::experi...resize_file(3) πŸ’–

okay so bestie, this is the C++ Standard Libary manual page β€” and yes, β€œLibary” is literally the spelling in the source, we are leaving it, no cap πŸ’…. The star of the show is std::experimental::filesystem::resize_file, and I’m highkey obsessed with how specific this little function is.

🌸 NAME 🌸

std::experimental::filesystem::resize_file β€” and the page’s short description is, iconically, the exact same thing again: std::experimental::filesystem::resize_file.

πŸ¦‹ Synopsis πŸ¦‹

Defined in header <experimental/filesystem> ✨

The signatures are right here, with the (filesystem TS) exactly where the page puts it:

void resize_file( const path& p, std::uintmax_t new_size );
void resize_file( const path& p, std::uintmax_t new_size,
(filesystem TS)
error_code& ec );

so what does it do? It changes the size of the regular file named by p as if by POSIX truncate: if the file size was previously larger than new_size, the remainder of the file is discarded. If the file was previously smaller than new_size, the file size is increased and the new area appears as if zero-filled. literally truncate behavior, bestie 🫢.

πŸŽ€ Parameters πŸŽ€

  • p β€” path to resize.
  • new_size β€” size that the file will now have.
  • ec β€” out-parameter for error reporting in the non-throwing overload.

πŸ’… Return value πŸ’…

(none) β€” it’s giving void, bestie. No return value, periodt.

πŸ”₯ Exceptions πŸ”₯

  • The overload that does not take an error_code& parameter throws filesystem_error on underlying OS API errors, constructed with p as the first argument and the OS error code as the error code argument. std::bad_alloc may be thrown if memory allocation fails.
  • The overload taking an error_code& parameter sets it to the OS API error code if an OS API call fails, and executes ec.clear() if no errors occur. This overload has noexcept specification: noexcept.

πŸ¦‹ Notes πŸ¦‹

On systems that support sparse files, increasing the file size does not increase the space it occupies on the file system: space allocation takes place only when non-zero bytes are written to the file. lowkey sparse-file magic, iykyk ✨

πŸ“ Example πŸ“

Demonstrates the effect of creating a sparse file on the free space.

The page says // Run this code, so run it, bestie 😭:

#include <experimental/filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::experimental::filesystem;

int main()
{
    fs::path p = fs::temp_directory_path() / "example.bin";
    std::ofstream(p).put('a');
    std::cout << "File size:  " << fs::file_size(p) << '\n'
              << "Free space: " << fs::space(p).free << '\n';
    fs::resize_file(p, 64*1024); // resize to 64 KB
    std::cout << "File size:  " << fs::file_size(p) << '\n'
              << "Free space: " << fs::space(p).free << '\n';
    fs::remove(p);
}

Possible output:

File size:  1
Free space: 31805444096
File size:  65536
Free space: 31805444096

🌈 See also 🌈

  • file_size β€” returns the size of a file (function).
  • space β€” determines available free space on the file system (function).

πŸ‘‘ Categories πŸ‘‘

  • Noindexed pages
  • unconditionally noexcept

🧚 Hidden categories 🧚

  • Pages with unreviewed unconditional noexcept template
  • Pages with unreviewed noexcept template

and that’s the whole page, bestie πŸ’–. The footer/source thing was http://cppreference.com, version/date 2024.06.10, and the footer title was std::experi...resize_file(3) β€” mwah πŸ’‹βœ¨

πŸ“¦ where this page comes from