7个版本
0.2.3 | 2023年3月10日 |
---|---|
0.2.2 | 2023年2月22日 |
0.2.1 | 2020年3月28日 |
0.2.0 | 2016年4月1日 |
0.1.2 | 2016年2月13日 |
#343 in 网络编程
在refractor中使用
245KB
4.5K SLoC
librsync-rs
Rust对librsync的绑定。
简介
此库包含对librsync 1的绑定,以支持计算和应用程序的网络差分,用于rsync和duplicity备份应用程序。此库封装了rsync协议的算法,该算法高效地计算文件之间的差异。
当rsync协议计算差异时,不需要两个文件都存在。它只需要新文件和第一文件(即签名)的一组校验和。计算出的差异可以存储在差分文件中。然后,rsync协议可以通过拥有旧文件和差分来重现新文件。
安装
只需将相应的条目添加到您的Cargo.toml
依赖项列表中
[dependencies]
librsync = "0.2"
并将此添加到您的crate根目录
extern crate librsync;
类型和模块概述
此crate在上层模块中提供生成签名、差分和补丁的流操作,使用Signature
、Delta
和Patch
结构体。这些结构体接受一些输入流(Read
或Read + Seek
特质)并实现另一个流(Read
特质),可以从其中读取输出。
在whole
子模块中提供更高级的操作。如果应用程序不需要对IO操作有精细的控制,可以使用sig
、delta
和patch
子模块。这些函数通过单个调用将算法应用于输出流(实现Write
特质)。
示例:流
本例展示了如何遍历流式API,从输入字符串和修改后的字符串开始,这两个字符串分别作为旧文件和新文件。该示例模拟了一个现实世界场景,其中计算了基本文件的签名,将其用作输入来计算基本文件和新文件之间的差异,并最终通过使用补丁和基本文件来重建新文件。
extern crate librsync;
use std::io::prelude::*;
use std::io::Cursor;
use librsync::{Delta, Patch, Signature};
fn main() {
let base = "base file".as_bytes();
let new = "modified base file".as_bytes();
// create signature starting from base file
let mut sig = Signature::new(base).unwrap();
// create delta from new file and the base signature
let delta = Delta::new(new, &mut sig).unwrap();
// create and store the new file from the base one and the delta
let mut patch = Patch::new(Cursor::new(base), delta).unwrap();
let mut computed_new = Vec::new();
patch.read_to_end(&mut computed_new).unwrap();
// test whether the computed file is exactly the new file, as expected
assert_eq!(computed_new, new);
}
请注意,中间结果不存储在临时容器中。这是因为操作实现了Read
特质。这样,在计算过程中,结果不需要完全驻留在内存中。
示例:整个文件API
本例展示了如何遍历整个文件API,从输入字符串和修改后的字符串开始,这两个字符串分别作为旧文件和新文件。与流式示例不同,在这里我们调用一个单独的函数,以获取签名、差异和补丁操作的计算结果。当使用输出流(如网络套接字或文件)作为操作输出时,这很方便。
extern crate librsync;
use std::io::Cursor;
use librsync::whole::*;
fn main() {
let base = "base file".as_bytes();
let new = "modified base file".as_bytes();
// signature
let mut sig = Vec::new();
signature(&mut Cursor::new(base), &mut sig).unwrap();
// delta
let mut dlt = Vec::new();
delta(&mut Cursor::new(new), &mut Cursor::new(sig), &mut dlt).unwrap();
// patch
let mut out = Vec::new();
patch(&mut Cursor::new(base), &mut Cursor::new(dlt), &mut out).unwrap();
assert_eq!(out, new);
}
许可证
根据以下任一许可证授权:
- Apache许可证2.0版本,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
此库使用librsync,它附带LGPL-2.0许可证。请在使用此库之前,确保满足librsync的许可要求。
贡献
除非您明确声明,否则根据Apache-2.0许可证定义,您提交的任何有意包含在工作中的贡献,均应按上述方式双许可,不附加任何额外条款或条件。