#fs #err #error


A drop-in replacement for std::fs with more helpful error messages

14 stable releases

2.9.0 Oct 31, 2022
2.7.0 Feb 19, 2022
2.6.0 May 6, 2021
2.5.0 Sep 27, 2020
0.1.2 Feb 10, 2020

#27 in Filesystem

Download history 70330/week @ 2022-12-08 73138/week @ 2022-12-15 62349/week @ 2022-12-22 55733/week @ 2022-12-29 87193/week @ 2023-01-05 87308/week @ 2023-01-12 86299/week @ 2023-01-19 94880/week @ 2023-01-26 88266/week @ 2023-02-02 92755/week @ 2023-02-09 86593/week @ 2023-02-16 92554/week @ 2023-02-23 90455/week @ 2023-03-02 96577/week @ 2023-03-09 94048/week @ 2023-03-16 104649/week @ 2023-03-23

403,040 downloads per month
Used in 301 crates (71 directly)


1.5K SLoC


Crates.io GitHub Actions

fs-err is a drop-in replacement for std::fs that provides more helpful messages on errors. Extra information includes which operations was attempted and any involved paths.

Error Messages

Using std::fs, if this code fails:

let file = File::open("does not exist.txt")?;

The error message that Rust gives you isn't very useful:

The system cannot find the file specified. (os error 2)

...but if we use fs-err instead, our error contains more actionable information:

failed to open file `does not exist.txt`
    caused by: The system cannot find the file specified. (os error 2)


fs-err's API is the same as std::fs, so migrating code to use it is easy.

// use std::fs;
use fs_err as fs;

let contents = fs::read_to_string("foo.txt")?;

println!("Read foo.txt: {}", contents);

fs-err uses std::io::Error for all errors. This helps fs-err compose well with traits from the standard library like std::io::Read and crates that use them like serde_json:

use fs_err::File;

let file = File::open("my-config.json")?;

// If an I/O error occurs inside serde_json, the error will include a file path
// as well as what operation was being performed.
let decoded: Vec<String> = serde_json::from_reader(file)?;

println!("Program config: {:?}", decoded);


Licensed under either of

at your option.


Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.


~60K SLoC