A Rust library that provides additional functionality not present in std::fs.
- 
Copy files (optionally with information about the progress). 
- 
Copy directories recursively (optionally with information about the progress). 
- 
Move files (optionally with information about the progress). 
- 
Move directories recursively (optionally with information about the progress). 
- 
A single method for create and write Stringcontent in file.
- 
A single method for open and read Stringcontent from file.
- 
Get folder size 
- 
Get collection of directory entries 
| Function | Description | 
|---|---|
| fs_extra::copy_items | Recursively copies files and directories from one location to another | 
| fs_extra::copy_items_with_progress | Recursively copies files and directories from one location to another with information about progress | 
| fs_extra::move_items | Recursively moves files and directories from one location to another | 
| fs_extra::move_items_with_progress | Recursively moves files and directories from one location to another with information about progress | 
| fs_extra::remove_items | Removes files or directories | 
| fs_extra::file::copy | Copies the contents of one file to another | 
| fs_extra::file::copy_with_progress | Copies the contents of one file to another with information about progress | 
| fs_extra::file::move_file | Moves a file from one location to another | 
| fs_extra::file::move_file_with_progress | Moves a file from one location to another with information about progress | 
| fs_extra::file::remove | Removes a file | 
| fs_extra::file::read_to_string | Reads file content into a String | 
| fs_extra::file::write_all | Writes Stringcontent to a file | 
| fs_extra::dir::create | Creates a new, empty directory at the given path | 
| fs_extra::dir::create_all | Recursively creates a directory and all of its parent components if they are missing | 
| fs_extra::dir::copy | Recursively copies the directory contents from one location to another | 
| fs_extra::dir::copy_with_progress | Recursively copies the directory contents from one location to another with information about progress | 
| fs_extra::dir::move_dir | Moves directory contents from one location to another | 
| fs_extra::dir::move_dir_with_progress | Moves directory contents from one location to another with information about progress | 
| fs_extra::dir::remove | Removes directory | 
| fs_extra::dir::get_size | Returns the size of the file or directory | 
| fs_extra::dir::get_dir_content | Gets details such as the size and child items of a directory | 
| fs_extra::dir::get_dir_content2 | Gets details such as the size and child items of a directory using specified settings | 
| fs_extra::dir::get_details_entry | Gets attributes of a directory entry | 
| fs_extra::dir::ls | Gets attributes of directory entries in a directory | 
Add this to your Cargo.toml:
[dependencies]
fs_extra = "1.3.0"The following example shows how to copy a directory recursively and display progress. First a source directory ./temp/dir containing file test1.txt and a subdirectory sub is createad with sub itself having a file test2.txt. ./temp/dir and all contents are then copied out to ./out/dir.
use std::path::Path;
use std::{thread, time};
use std::sync::mpsc::{self, TryRecvError};
extern crate fs_extra;
use fs_extra::dir::*;
use fs_extra::error::*;
fn example_copy() -> Result<()> {
    let path_from = Path::new("./temp");
    let path_to = path_from.join("out");
    let test_folder = path_from.join("test_folder");
    let dir = test_folder.join("dir");
    let sub = dir.join("sub");
    let file1 = dir.join("file1.txt");
    let file2 = sub.join("file2.txt");
    create_all(&sub, true)?;
    create_all(&path_to, true)?;
    fs_extra::file::write_all(&file1, "content1")?;
    fs_extra::file::write_all(&file2, "content2")?;
    assert!(dir.exists());
    assert!(sub.exists());
    assert!(file1.exists());
    assert!(file2.exists());
    let mut options = CopyOptions::new();
    options.buffer_size = 1;
    let (tx, rx) = mpsc::channel();
    thread::spawn(move || {
        let handler = |process_info: TransitProcess| {
            tx.send(process_info).unwrap();
            thread::sleep(time::Duration::from_millis(500));
            fs_extra::dir::TransitProcessResult::ContinueOrAbort
        };
        copy_with_progress(&test_folder, &path_to, &options, handler).unwrap();
    });
    loop {
        match rx.try_recv() {
            Ok(process_info) => {
                println!("{} of {} bytes",
                         process_info.copied_bytes,
                         process_info.total_bytes);
            }
            Err(TryRecvError::Disconnected) => {
                println!("finished");
                break;
            }
            Err(TryRecvError::Empty) => {}
        }
    }
    Ok(())
}
fn main() {
    example_copy();
}