- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
采取方案
我想在处理文件(photoshop / word / powerpoint等(例如二进制数据))的过程中创建备份,因此每次创建v0.x时,我也会创建一个备份。
但是我想使用rdiff做到这一点,因此我只需要存储原始版本和当前版本之间的差异。
我是using the code found here,我的代码(运行)如下
package main
import (
"bufio"
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"os"
"github.com/jbreiding/rsync-go"
)
var originalFile string
var newFile string
var patchFile string
var signatureFile string
var appliedFile string
func openFile(path string) ([]byte, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
fmt.Println("File reading error", err)
}
return data, err
}
func writeFile(path string, data []byte) error {
err := ioutil.WriteFile(path, data, 0644)
return err
}
func main() {
originalFile = "./profile-shot.jpg"
newFile = "./profile-shot-to.jpg"
patchFile = "./profile-shot.patch"
signatureFile = "./profile-shot.sig"
appliedFile = "./profile-shot-applied.jpg"
//create a signature based on the original file
originalFileReader, _ := os.Open(originalFile)
defer originalFileReader.Close()
rs := &rsync.RSync{}
//take a signature of the new
//apply it to the original
//get a delta
//apply the delta to the original
//get the new??
// 1. prepare a signature
sig := make([]rsync.BlockHash, 0, 10)
writeSignature := func(bl rsync.BlockHash) error {
sig = append(sig, bl)
return nil
}
//2. take the new file
newFileReader, _ := os.Open(newFile)
//3. create the signature
rs.CreateSignature(originalFileReader, writeSignature)
sigBytes, err := json.Marshal(sig)
if err != nil {
fmt.Println("error ", err)
} else {
writeFile(signatureFile, sigBytes)
}
opsOut := make(chan rsync.Operation)
dataWriter := bufio.NewWriter(&dataBuffer)
//4. specify a write operation for the delta
writeOperation := func(op rsync.Operation) error {
opsOut <- op
data, err := json.Marshal(op.Data)
if err != nil {
fmt.Println("error ", err)
}
if _, err := dataWriter.Write(data); err != nil {
fmt.Println("error writing data ", err)
}
return nil
}
var dataBuffer bytes.Buffer
go func() {
defer close(opsOut)
//5. in a routine, create a delta from the new image and the signature of the original
err := rs.CreateDelta(newFileReader, sig, writeOperation)
fmt.Println("err creating delta ", err)
writeFile(patchFile, dataBuffer.Bytes())
fmt.Println("length of signature ", len(sig))
//now we have written the patch to file, we can open the applied file and write the data from the patch to it, by passing the struct(s) to a new opsOut channel, and calling apply delta using that channel
}()
// saving the applied delta resulting file
newFileWriter, err := os.OpenFile(appliedFile, os.O_RDWR|os.O_CREATE, 0600)
if err != nil {
fmt.Println("error source writer ", err)
}
originalFileReader.Seek(0, os.SEEK_SET)
//6. apply the delta
rs.ApplyDelta(newFileWriter, originalFileReader, opsOut)
}
最佳答案
最小化增量想法:
diffData:=diff(decompress(oldImage),decompress(newImage))
(您需要一个快速的二进制差异算法)
newImage:=recompress(patch(decompress(oldImage),diffData))
(重新压缩算法要求:结果new newImage必须与diff之前的相同)
关于algorithm - 使用rdiff/bsdiff以最佳时间/存储/加载方式从文件的原始版本(v0.1)转到新版本(v0.2),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59741262/
我需要删除备份以释放服务器上的空间。虽然我不知道删除它们的命令中应该指定什么目录rdiff-backup --remove-older-than 20B host.net::/remote-dir。到
我必须在 Java 中执行 rdiff-backup 命令。我绝望地尝试使用运行时执行从本地到远程的备份命令。 我需要使用远程架构,因为我无法连接到标准端口 22。 由于相同的命令在 Windows
我正在尝试使用 rdiff 从 docker 容器中创建一个备份解决方案。我有 python 安装和 python-dev 包,但是当我运行安装命令时: python ./setup.py insta
我想在 python 中创建一个 rdiff-backup 包装程序,用于将 windows 机器备份到 linux 服务器。 我想在包装程序中处理 rdiff-backup 的输出。但是当使用子进程
我正在运行 rdiff-backup 来备份远程系统上的一些文件夹。 rdiff-backup root@::/apps/myapp/shared/system /home/backups/syste
我正在使用 rdiff-backup .非常棒的简单强大的备份工具。但是,我正在与通配符 glob 模式作斗争。我有这个目录结构: /data/aaa/cache /data/bbb/cache /d
我正在使用 rdiff-backup .非常棒的简单强大的备份工具。但是,我正在与通配符 glob 模式作斗争。我有这个目录结构: /data/aaa/cache /data/bbb/cache /d
我有这个非常简单的 bash 脚本: #!/opt/bin/bash /opt/bin/rdiff-backup --force --print-statistics myhost::/var/bkp
我正在尝试在 CentOS 6 x64 机器上构建最新版本的 rdiff-backup。 (linode)。 我收到如下错误: /usr/bin/ld: cannot find -lrsync 我已经
我是一名优秀的程序员,十分优秀!