#archiver #snappy #metro-hash #file-exists #target-directory #integer

nightly dochy_archiver

一种压缩整数的序列化器

16 个版本 (7 个破坏性更新)

0.8.0 2021 年 9 月 4 日
0.7.1 2021 年 4 月 27 日
0.6.1 2021 年 4 月 13 日
0.5.0 2021 年 4 月 12 日
0.1.3 2021 年 2 月 20 日

#1025 in 文件系统

MIT/Apache

83KB
1.5K SLoC

一个使用 Snappy 压缩归档文件夹的归档器,并从文件的元数据中计算 128 位哈希。

读取实际文件不需要计算哈希。哈希算法是 MetroHash。

它是 Dochy 文件系统的一个组件。

fn main() -> ArcResult<()>{
    let mut buf: Vec<u8> = vec![];
    let r = create_archive_from_directory(
        "foo/some_dir_path", &mut buf,
        |hash| {
            //No files are modified when the same hash already exists,
            //so you can safely cancel the archiving process
            Path::new("bar/some_dir2").join(format!("{}", hash)).exists()
        }, &ArchiveOptions::new())?;
    
    let path = match r{
        CreateArchiveFromDirectory::WrittenSuccessfully(_size, hash) =>{
            let path = Path::new("bar/some_dir2").join(format!("{}", hash));
            //save the hash and the archived data
            let mut file = File::create(path)?;
            file.write_all(&buf);
            path
        },
        CreateArchiveFromDirectory::Canceled(hash) =>{
            Path::new("bar/some_dir2").join(format!("{}", hash));
        }
    };

    //archive file exists either way
    let mut archive_file = File::open(path)?;
    let archive_data = read_archive_data(&mut archive_file)?;
    
    //resume the archive to the target directory
    resume_archive("baz/target_dir", &archive_data, true)?;
    Ok(())
}

变更日志

0.3.2 & 0.3.3

  • 修复了 readme。

0.3.1

  • 修复了 0.3.0 中的错误,并再次更改了一些函数的签名。

0.3.0

  • 添加了文档。
  • 更改了许多公共函数的签名,并隐藏了一些实现细节。

0.2.0

  • 完全重写,现在这个库可以作为通用归档器使用

0.1.3

  • 更新了 readme

依赖

~2.5–3.5MB
~60K SLoC