std::filesy...try::assign(3)

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

hii bestie πŸ’– this is the std::filesy...try::assign(3) page from the C++ Standard Libary manual, and we’re about to make directory_entry::assign make sense. no cap. ✨


πŸ’– NAME πŸ’–

std::filesystem::directory_entry::assign β€” std::filesystem::directory_entry::assign

(the manpage really says it twice, and honestly? iconic. πŸ’…)

🌸 Synopsis 🌸

okay so there are two overloads, both since C++17, and here they are exactly:

  • (1) (since C++17) β€” void assign( const std::filesystem::path& p );
  • (2) (since C++17) β€” void assign( const std::filesystem::path& p, std::error_code& ec );

Assigns new content to the directory entry object. Sets the path to p and calls refresh to update the cached attributes. If an error occurs, the values of the cached attributes are unspecified. 🫢

important vibe check: This function does not commit any changes to the filesystem. it’s giving β€œlook, don’t touch” energy, periodt. πŸ’…

πŸŽ€ Parameters πŸŽ€

  • p β€” path to the filesystem object to which the directory entry will refer. πŸ›€οΈ
  • ec β€” out-parameter for error reporting in the non-throwing overload. 🩹

πŸ¦‹ Return value πŸ¦‹

(none) β€” literally nothing comes back, bestie. 🫢

πŸ’… Exceptions πŸ’…

Any overload not marked noexcept may throw std::bad_alloc if memory allocation fails. 😭 memory said no.

  1. Throws std::filesystem::filesystem_error on underlying OS API errors, constructed with p as the first path argument and the OS error code as the error code argument. πŸ”₯
  2. Sets a std::error_code& parameter to the OS API error code if an OS API call fails, and executes ec.clear() if no errors occur. βœ…

🌈 Example 🌈

// Run this code

#include <filesystem>
#include <fstream>
#include <iostream>

void print_entry_info(const std::filesystem::directory_entry& entry)
{
    if (std::cout << "The entry " << entry; not entry.exists())
    {
        std::cout << " does not exists on the file system\n";
        return;
    }
    std::cout << " is ";
    if (entry.is_directory())
        std::cout << "a directory\n";
    if (entry.is_regular_file())
        std::cout << "a regular file\n";
    /*...*/
}

int main()
{
    std::filesystem::current_path(std::filesystem::temp_directory_path());

    std::filesystem::directory_entry
       entry{std::filesystem::current_path()};
    print_entry_info(entry);

    std::filesystem::path name{"cppreference.html"};
    std::ofstream{name} << "C++";

    std::cout << "entry.assign();\n";
    entry.assign(entry/name);
    print_entry_info(entry);

    std::cout << "remove(entry);\n";
    std::filesystem::remove(entry);
    print_entry_info(entry); // the entry still contains old "state"

    std::cout << "entry.assign();\n";
    entry.assign(entry); // or just call entry.refresh()
    print_entry_info(entry);
}

🌈 Possible output: 🌈

The entry "/tmp" is a directory
entry.assign();
The entry "/tmp/cppreference.html" is a regular file
remove(entry);
The entry "/tmp/cppreference.html" is a regular file
entry.assign();
The entry "/tmp/cppreference.html" does not exists on the file system

πŸ‘‘ See also πŸ‘‘

  • operator= β€” assigns contents (public member function)

source/version and date: http://cppreference.com Β· 2024.06.10 Β· std::filesy...try::assign(3) β€” bye bestie, go assign with main character energy πŸ’…βœ¨

πŸ“¦ where this page comes from