FileSnap:用于差分文件快照的 Windows 库!






4.62/5 (5投票s)
将文件版本、快照和增量备份包含在一个文件中
- GitHub: 这是我多线程工具的一部分:https://github.com/WindowsNT/mt
引言
通常,您希望拥有文件的多个版本,但不想依赖 Windows NTFS 版本控制。这里有一个简单的 Win32 类,您可以轻松使用它。
背景
您需要
- 我自己的 DIFF 库
- filesnap.h
ZIP 文件包含一个现成的记事本,演示了该库在文本编辑器中的使用(Finalize()
和键盘快捷键尚未实现)。其中包含一个简单的 1.stxt 文件以供打开。
Using the Code
class FILESNAP
{
public:
struct alignas(8) FSITEM
{
CLSID cid = FILESNAP::GUID_HEADER;
unsigned long long DiffAt = 0;
FILETIME created = ti();
FILETIME updated = ti();
unsigned long long i = 0;
unsigned long long at = 0;
unsigned long long sz = 0;
unsigned long long extradatasize = 0;
};
inline bool BuildMap(vector<FSITEM>& fsx);
FILESNAP(const wchar_t* fi);
inline bool SetSnap(size_t idx,int CommitForce = 0);
inline bool Create(DWORD Access= GENERIC_READ | GENERIC_WRITE, DWORD Share = 0,
LPSECURITY_ATTRIBUTES Atrs = 0, DWORD Disp = CREATE_NEW, DWORD Flags = 0);
inline unsigned long long Size();
inline bool Finalize();
inline bool Commit(size_t At,int Mode);
inline HANDLE GetH();
inline BOOL Write(const char* d, unsigned long long sz2);
inline BOOL Read(char* d, unsigned long long sz2);
inline unsigned long long SetFilePointer(unsigned long long s, DWORD m = FILE_BEGIN);
inline BOOL SetEnd();
inline void Close();
};
使用该类
- 您想创建一个新文件,只需将名称传递给
FILESNAP
构造函数即可。 - 使用
CreateFile
标志CREATE_NEW
调用Create()
以创建文件。 - 使用
Write()
向文件写入数据。 - 当您想保存当前版本时,调用
Commit(0,0)
。对于第一次保存,Commit()
会忽略这两个参数。 - 继续使用
Write()
向文件写入数据。 - 下一次
Commit()
调用会将当前内容保存为差异备份。如果Mode
参数为0
,则Commit()
始终保存为与第一个提交的差异备份。如果Mode
参数为1
,则Commit()
保存为与At
参数指定的提交号的差异备份。这允许您使用差异备份或增量备份。 - 继续使用
Read()
、Write()
、SetEnd()
、SetFilePointer()
、Size()
和GetH()
函数对当前句柄进行写入、读取或其他操作,该函数返回当前HANDLE
,您可以在其他文件函数中使用它。 - 如果您想恢复到特定的保存,请使用
SetSnap
。CommitForce
可以为0
、1
或2
0
表示如果文件已经存在,则该函数将失败。1
表示如果文件已经存在,则在恢复之前进行提交。2
不在恢复之前进行提交。
- 在使用
SetSnap()
后,Read()
/Write()
/GetH()
等操作将在恢复的数据上进行。 Close()
将关闭文件(不进行提交),并删除类使用的所有临时文件。
当您打开现有文件时,该类会自动调用 SetSnap()
,以在文件中找到的最后一个快照上进行操作。您可以调用 BuildMap()
以返回包含在文件中的所有快照的 FSITEM
数组。
如果您构建的文件主要使用差异备份(与第一个快照相关),则文件会更大,但打开速度更快,因为只会执行一项操作(比较第一个快照和打开的快照)。
如果您构建的文件主要使用增量备份(与最后一个快照相关),则文件会更小,但打开速度较慢,因为加载快照时必须处理所有快照。
小心使用 GetH()
,因为当调用 Commit()
或 SetSnap()
时,它返回的 HANDLE
将不再有效。
玩得开心!
历史
- 2017年10月19日 - 修正了一些错别字
- 2017年10月8日 - 首次发布