Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

rixcpp/fs

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

fs

Minimal modern filesystem utilities for C++20.

fs provides deterministic wrappers around std::filesystem with explicit error handling and zero hidden behavior.

Header-only by default. Zero external dependencies.


Download

https://github.com/rixcpp/rix

(Part of the Rix modular utility library)


Why fs?

Filesystem access is required in:

  • Configuration loading
  • Asset management
  • Build systems
  • Logging systems
  • Temporary file handling
  • CLI tooling
  • Deployment scripts

This module provides:

  • Path normalization and helpers
  • Safe existence checks
  • Explicit file read/write
  • Directory listing
  • Recursive operations
  • Canonical path resolution
  • Deterministic error handling

No implicit encoding. No hidden symlink resolution. No silent failures.

Just minimal deterministic filesystem tools.


Installation

Using Rix (umbrella)

find_package(rix REQUIRED)
target_link_libraries(my_app PRIVATE rix::fs)

Using rix::all

target_link_libraries(my_app PRIVATE rix::all)

Manual

git clone https://github.com/rixcpp/rix.git

Add the include/ directory from modules/fs to your project.


Quick Examples

Check Path Existence

#include <rix/fs/file.hpp>
#include <iostream>

int main()
{
    if (rix::fs::path_exists("data.txt"))
    {
        std::cout << "File exists\n";
    }
}

Read / Write Text

#include <rix/fs/file.hpp>
#include <iostream>

int main()
{
    rix::fs::write_text("example.txt", "hello");
    auto content = rix::fs::read_text("example.txt");

    std::cout << content << "\n";
}

File Size

#include <rix/fs/file.hpp>
#include <iostream>

int main()
{
    try
    {
        auto size = rix::fs::file_size_bytes("example.txt");
        std::cout << size << "\n";
    }
    catch (const std::exception& e)
    {
        std::cerr << e.what() << "\n";
    }
}

Directory Listing

#include <rix/fs/dir.hpp>
#include <iostream>

int main()
{
    for (auto& entry : rix::fs::list_dir("."))
    {
        std::cout << entry << "\n";
    }
}

Recursive Copy

#include <rix/fs/ops.hpp>

int main()
{
    rix::fs::recursive_copy("assets", "backup_assets", true);
}

API Overview

Path Helpers (rix::fs::path)

normalize(path);
join(a, b);
filename(path);
stem(path);
extension(path);
parent(path);
replace_extension(path, ext);

File Helpers (rix::fs::file)

path_exists(path);
is_file_path(path);
is_dir_path(path);
file_size_bytes(path);
read_text(path);
read_bytes(path);
write_text(path, text);
append_text(path, text);
write_bytes(path, span);
copy_file(from, to, overwrite);
remove_file(path);

Directory Helpers

create_dir(path);
create_dirs(path);
list_dir(path);
list_dir_recursive(path);
remove_dir(path);
remove_all(path);

Operations

move(from, to);
rename(from, to);
recursive_copy(from, to);
recursive_remove(path);
ensure_dir(path);

Utilities

current_path();
set_current_path(path);
absolute(path);
canonical(path);
weakly_canonical(path);
temp_directory();
equivalent(a, b);

Design Principles

  • Explicit over implicit
  • No hidden fallback logic
  • No ADL ambiguity with std
  • Deterministic error propagation
  • Modern C++20 only
  • Minimal surface area

This module intentionally does not provide:

  • Async file I/O
  • File watchers
  • Memory-mapped files
  • Encoding detection
  • Compression
  • Platform abstraction layers

Build those on top.


Error Handling

Non-throwing checks use std::error_code.

Throwing operations use:

  • std::system_error for filesystem failures
  • std::runtime_error for logical misuse

Behavior is explicit and predictable.


Performance Notes

  • Thin wrapper over std::filesystem
  • No dynamic polymorphism
  • No heap allocations beyond STL usage
  • No hidden caching
  • No global state

Designed for clarity and determinism.


Tests

cmake --preset dev-ninja
cmake --build --preset dev-ninja
ctest --preset dev-ninja

Tests verify:

  • Path helpers
  • File read/write integrity
  • Directory operations
  • Recursive operations
  • Exception correctness
  • Cleanup correctness

License

MIT License
Copyright (c) Gaspard Kirira

About

Filesystem utilities: paths, directories, file operations.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Morty Proxy This is a proxified and sanitized view of the page, visit original site.