65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.62/5 (5投票s)

2017年10月8日

CPOL

2分钟阅读

viewsIcon

16782

downloadIcon

120

将文件版本、快照和增量备份包含在一个文件中

引言

通常,您希望拥有文件的多个版本,但不想依赖 Windows NTFS 版本控制。这里有一个简单的 Win32 类,您可以轻松使用它。

背景

您需要

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,您可以在其他文件函数中使用它。
  • 如果您想恢复到特定的保存,请使用 SetSnapCommitForce 可以为 012
    • 0 表示如果文件已经存在,则该函数将失败。
    • 1 表示如果文件已经存在,则在恢复之前进行提交。
    • 2 不在恢复之前进行提交。
  • 在使用 SetSnap() 后,Read()/Write()/GetH() 等操作将在恢复的数据上进行。
  • Close() 将关闭文件(不进行提交),并删除类使用的所有临时文件。

 

当您打开现有文件时,该类会自动调用 SetSnap(),以在文件中找到的最后一个快照上进行操作。您可以调用 BuildMap() 以返回包含在文件中的所有快照的 FSITEM 数组。

如果您构建的文件主要使用差异备份(与第一个快照相关),则文件会更大,但打开速度更快,因为只会执行一项操作(比较第一个快照和打开的快照)。

如果您构建的文件主要使用增量备份(与最后一个快照相关),则文件会更小,但打开速度较慢,因为加载快照时必须处理所有快照。

小心使用 GetH(),因为当调用 Commit() SetSnap() 时,它返回的 HANDLE 将不再有效。

玩得开心!

历史

  • 2017年10月19日 - 修正了一些错别字
  • 2017年10月8日 - 首次发布
FileSnap:用于差异文件快照的 Windows 库! - CodeProject - 代码之家
© . All rights reserved.