{"id":24154836,"url":"https://github.com/manuel-woelker/rust-vfs","last_synced_at":"2025-12-12T16:39:51.486Z","repository":{"id":8547184,"uuid":"58804881","full_name":"manuel-woelker/rust-vfs","owner":"manuel-woelker","description":"A virtual filesystem for Rust","archived":false,"fork":false,"pushed_at":"2025-09-02T17:50:34.000Z","size":245,"stargazers_count":442,"open_issues_count":25,"forks_count":49,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-09-02T19:26:42.141Z","etag":null,"topics":["filesystem","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/manuel-woelker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-05-14T11:40:22.000Z","updated_at":"2025-09-02T17:50:38.000Z","dependencies_parsed_at":"2023-01-13T14:51:58.213Z","dependency_job_id":"18008401-061a-4c4c-9e9c-b3b6c288486d","html_url":"https://github.com/manuel-woelker/rust-vfs","commit_stats":{"total_commits":154,"total_committers":11,"mean_commits":14.0,"dds":0.1298701298701299,"last_synced_commit":"ef371f27b7bb5e34b71a192c0ada69fde453cf6f"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/manuel-woelker/rust-vfs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manuel-woelker%2Frust-vfs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manuel-woelker%2Frust-vfs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manuel-woelker%2Frust-vfs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manuel-woelker%2Frust-vfs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/manuel-woelker","download_url":"https://codeload.github.com/manuel-woelker/rust-vfs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manuel-woelker%2Frust-vfs/sbom","scorecard":{"id":615836,"data":{"date":"2025-08-11","repo":{"name":"github.com/manuel-woelker/rust-vfs","commit":"ec3f82230e596aad7c081664845cbb85be525dc0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.2,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":7,"reason":"8 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":2,"reason":"Found 8/30 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/compile.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/compile.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/manuel-woelker/rust-vfs/compile.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/compile.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/manuel-woelker/rust-vfs/compile.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/compile.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/manuel-woelker/rust-vfs/compile.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/compile.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/manuel-woelker/rust-vfs/compile.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/compile.yml:39: update your workflow using https://app.stepsecurity.io/secureworkflow/manuel-woelker/rust-vfs/compile.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/compile.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/manuel-woelker/rust-vfs/compile.yml/master?enable=pin","Info:   0 out of   1 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":3,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Info: 'force pushes' disabled on branch 'master'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'master'","Warn: could not determine whether codeowners review is allowed","Warn: no status checks found to merge onto branch 'master'","Warn: PRs are not required to make changes on branch 'master'; or we don't have data to detect it.If you think it might be the latter, make sure to run Scorecard with a PAT or use Repo Rules (that are always public) instead of Branch Protection settings"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 8 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":6,"reason":"4 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: RUSTSEC-2024-0384","Warn: Project is vulnerable to: GHSA-rr8g-9fpq-6wmg","Warn: Project is vulnerable to: RUSTSEC-2025-0023","Warn: Project is vulnerable to: RUSTSEC-2023-0078 / GHSA-8f24-6m29-wm2r"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T03:54:49.240Z","repository_id":8547184,"created_at":"2025-08-21T03:54:49.241Z","updated_at":"2025-08-21T03:54:49.241Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276011431,"owners_count":25569837,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-19T02:00:09.700Z","response_time":108,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["filesystem","rust"],"created_at":"2025-01-12T12:02:37.178Z","updated_at":"2025-09-19T22:31:17.353Z","avatar_url":"https://github.com/manuel-woelker.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"# rust-vfs\n\n[![Crate](https://img.shields.io/crates/v/vfs.svg)](https://crates.io/crates/vfs)\n[![API](https://docs.rs/vfs/badge.svg)](https://docs.rs/vfs)\n![Minimum rustc version](https://img.shields.io/badge/rustc-1.63.0+-green.svg)\n[![Actions Status](https://github.com/manuel-woelker/rust-vfs/workflows/Continuous%20integration/badge.svg)](https://github.com/manuel-woelker/rust-vfs/actions?query=workflow%3A%22Continuous+integration%22)\n\nA virtual filesystem for Rust\n\nThe virtual file system abstraction generalizes over file systems and allows using\ndifferent filesystem implementations (e.g. an in memory implementation for unit tests).\n\nThe primary envisioned use case is applications that need assets to be embedded in the executable or bundled as a resource archive:\n\n* For unit tests use an in-memory file system\n* For development use the actual filesystem with assets living in a directory for easy access and modification\n* For production, use either an embedded filesystem or an archive filesystem (think .zip, .wad or .mpq) for easier distribution as a single file\n* Incremental updates or mods are possible using an overlay file system combining multiple layers of different assets sources\n\nThis crate currently has the following implementations:\n * **PhysicalFS** - the actual filesystem of the underlying OS\n * **MemoryFS** - an ephemeral in-memory file system, intended mainly for unit tests\n * **AltrootFS** - a file system with its root in a particular directory of another filesystem\n * **OverlayFS** - an overlay file system combining two filesystems, an upper layer with read/write access and a lower layer with only read access\n * **EmbeddedFS** - a read-only file system embedded in the executable, requires `embedded-fs` feature, no async version available\n \nThe minimum supported Rust version (MSRV) is 1.63.\n \nComments and pull-requests welcome!\n\n**Note for async users**: I intend to sunset the `async_vfs` feature in the future since the `async-std` crate is discontinued. If you have any comments or \nfeedback, please leave a comment on [issue #77](https://github.com/manuel-woelker/rust-vfs/issues/77).\n\n## Changelog\n\n\n### 0.12.2 (2025-07-12)\n* Path: reduced memory allocations when joining paths  - thanks \n  [@landaire](https://github.com/landaire)!\n* Async Path: removed a stray debug println  - thanks\n  [@ryardley](https://github.com/ryardley)!\n\n\n### 0.12.1 (2025-03-24)\n* MemoryFS: The `flush()` method now makes the written data available to read calls (fixes [#70](https://github.com/manuel-woelker/rust-vfs/issues/70) - thanks [@krisajenkins](https://github.com/krisajenkins) for the throrough bug report!)\n\n### 0.12.0 (2024-03-09)\n* Allow reading and setting modification/creation/access-times - thanks [@kartonrad](https://github.com/kartonrad)!\n* Allow seek when writing - thanks [@jonmclean](https://github.com/jonmclean)!\n\n### 0.11.0 (2024-02-18)\n* Updated minimum supported Rust version to 1.63.\n* Updated rust-embed dependency to 8.0 - thanks [@NickAcPT](https://github.com/NickAcPT)!\n* Unlocked tokio crate version to work with newer versions - thanks [@Fredrik-Reinholdsen](https://github.com/Fredrik-Reinholdsen)!\n* use `Arc\u003cstr\u003e` for paths internally to reduce string allocations - thanks [@BrettMayson](https://github.com/BrettMayson)!\n\n### 0.10.0 (2023-09-08)\n* Added async port of the crate, in a new module `async_vfs`.\nThe module is behind the `async-vfs` feature flag which is not enabled by default. Huge thank you to [@Fredrik Reinholdsen](https://github.com/Fredrik-Reinholdsen)!\n* Ported all synchronous tests and doc-tests to async\n* Updated minimum supported Rust version to 1.61.0, needed for the async port.\n* Updated Rust edition from *2018* to *2021*, needed for the async port.\n* Updated Rust versions used in CI pipeline.\n\n### 0.9.0 (2022-12-20)\n\n* prevent `Path::create_dir_all()` failures when executing in parallel\n  (fixes [#47](https://github.com/manuel-woelker/rust-vfs/pull/47))\n* Allow absolute paths (e.g. starting with \"/\") in `VfsPath::join()`\n  ([#45](https://github.com/manuel-woelker/rust-vfs/pull/45) - thanks [@Property404](https://github.com/Property404))\n* Allow multiple consecutive slashes in paths\n  ([#43](https://github.com/manuel-woelker/rust-vfs/pull/43) - thanks [@Property404](https://github.com/Property404))\n* Add method `VfsPath::is_root()`\n  ([#44](https://github.com/manuel-woelker/rust-vfs/pull/44) - thanks [@Property404](https://github.com/Property404))\n* `Path::join()` now allows resolving '..' at the root (resolving to root itself)\n ([#41](https://github.com/manuel-woelker/rust-vfs/pull/41) - thanks [@Property404](https://github.com/Property404))  \n*  Add `Send` to trait objects returned from APIs\n   ([#40](https://github.com/manuel-woelker/rust-vfs/pull/40),\n   [#46](https://github.com/manuel-woelker/rust-vfs/pull/46) - thanks [@Property404](https://github.com/Property404))\n\n### 0.8.0 (2022-11-24)\n\n* Impl `std::error::Error` for `VfsError` ([#32](https://github.com/manuel-woelker/rust-vfs/pull/32)) and improved error \n  ergonomics for end users ([#34](https://github.com/manuel-woelker/rust-vfs/pull/34)) - thanks [@Technohacker](https://github.com/Technohacker)\n\n### 0.7.1 (2022-04-15)\n\n* Fixed a panic when accessing non-existing paths in `MemoryFS::append_file()` (closes \n [#31](https://github.com/manuel-woelker/rust-vfs/issues/31))\n\n### 0.7.0 (2022-03-26)\n\n* Update to `EmbeddedFS` to `rust-embed` v6 (closes [#29](https://github.com/manuel-woelker/rust-vfs/issues/29))\n* Make `OverlayFS` and `AltrootFS` available at the crate root, making it more consistent\n  (PR [#30](https://github.com/manuel-woelker/rust-vfs/issues/30) -\n  thanks [@Zyian](https://github.com/Zyian))\n\n### 0.6.2 (2022-03-07)\n\n* Activate `embedded-fs` feature when building on docs.rs to ensure that it actually shows up there\n  ([#28](https://github.com/manuel-woelker/rust-vfs/issues/28) - thanks [@Absolucy](https://github.com/Absolucy))\n\n### 0.6.1 (2022-03-06)\n\n* Added `VfsPath::root()` method to access the root path of a virtual filesystem\n  (closes [#26](https://github.com/manuel-woelker/rust-vfs/issues/26))\n* Added doctests to `VfsPath` docs to provide usage examples\n\n### 0.6.0 (2022-03-02)\n\n* Fixed path inconsistency issues in `EmbeddedFS` (closes [#24](https://github.com/manuel-woelker/rust-vfs/issues/24))\n* Added the test macro `test_vfs_readonly!` which allows verifying read-only filesystem implementations\n* Removed dependency on `thiserror` crate to improve compile times\n(closes [#25](https://github.com/manuel-woelker/rust-vfs/issues/25))\n\n### 0.5.2 (2022-02-07)\n\n* Removed potential panic in `OverlayFS` (closes [#23](https://github.com/manuel-woelker/rust-vfs/issues/23))\n* `VfsPath::join()` now takes AsRef\u003cstr\u003e instead of \u0026str to improve ergonomics with crates like camino\n\n### 0.5.1 (2021-02-13)\n\n* Exported `test_vfs` macro via the feature flag `export-test-macros` to allow downstream implementations to verify \n  expected behaviour\n* The MSRV is now 1.40 due to requirements in upstream crates\n* The embedded implementation was broken by the 0.5.0 API changes, and is now fixed\n\n### 0.5.0 (2021-02-13)\n\n* Added `EmbeddedFS` for using filesystems embeded in the binary using\n[rust-embed](https://github.com/pyros2097/rust-embed)\n(PR [#12](https://github.com/manuel-woelker/rust-vfs/issues/12) - thanks [@ahouts](https://github.com/ahouts))\n* Changed `VfsPath::exists()` to return `VfsResult\u003cbool\u003e` instead of plain `bool` (closes [#17](https://github.com/manuel-woelker/rust-vfs/issues/17))\n \n### 0.4.0 (2020-08-13)\n\n * Added `OverlayFS` union filesystem\n * Added `VfsPath::read_to_string()` convenience method\n * Added `VfsPath::walk_dir()` method for recursive directory traversal\n * Added `VfsPath::{copy,move}_{file,dir}()` methods (closes [#9](https://github.com/manuel-woelker/rust-vfs/issues/9))\n * License is now Apache 2.0\n * Minimum supported Rust version (MSRV) is 1.32.0\n\n### 0.3.0 (2020-08-04)\n\n * Refactored to use a trait based design, simplifying usage and testing\n \n### 0.2.1 (2020-02-06)\n\n * Added `AltrootFS` (thanks [@icefoxen](https://github.com/icefoxen))\n\n### 0.1.0 (2016-05-14)\n\n * Initial release\n \n## Roadmap\n\n * Support for read-only filesystems  \n * Support for re-mounting filesystems\n * Support for virtual filesystem access inside archives (e.g. zip)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanuel-woelker%2Frust-vfs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmanuel-woelker%2Frust-vfs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanuel-woelker%2Frust-vfs/lists"}