有许多可能的解决方案来执行文件备份应用程序。我需要知道哪种方法是坚如磐石的专业方式来执行数据文件的复制,即使文件正在使用或非常大。
有一种称为卷影复制(VSS)的已知方法,但是我已经读过它对于简单的复制操作来说太过分了,而是可以使用PInvoke BackupRead。
.NET框架提供了自己的方法:
File.Copy
和large files的FileStream
曾经(可能仍然)存在问题
null
似乎适合备份,但我找不到全面的描述,我不确定我是否正确。
请你告诉我应该使用哪种方法(也许我忽略了一些选项)以及为什么?如果首选VSS或PInvoke方法,您还可以提供一个如何使用它的示例或对综合文档的一些参考(特别是我对创建文件句柄的正确设置感兴趣,这将允许在文件时共享资源在使用中)。
提前致谢。
答案 0 :(得分:1)
您要在实时(即当前正在运行的操作系统)卷中尝试的所有内容都将无法打开某些文件。原因是,应用程序和操作系统本身只打开文件 - 也就是说,它们使用ShareMode = 0打开文件。您将无法读取这些文件。
VSS与支持VSS的应用程序协商,在此期间发布其打开的文件,但微软以外的相对较少的应用程序都支持VSS。
另一种方法是启动到另一个操作系统(在USB记忆棒或其他磁盘上)并从那里开始工作。例如,您可以使用Microsoft预安装环境(WinPE)。您可以通过一些努力从那里运行.Net 4.x应用程序。在这样的环境中,您可以访问目标卷上的任何文件,而不会共享违规行为。
WinPE以本地管理员身份运行。因此,您需要声明权限,例如SE_BACKUP_NAME,SE_RESTORE_NAME,SE_SECURITY_NAME,SE_TAKE_OWNERSHIP_NAME,并且需要使用名为BACKUP_SEMANTCS的标记打开文件...如here所述。
如果尴尬,BackupRead / BackupWrite API是有效的。您不能将异步文件句柄与这些API一起使用......或者至少MS声称您正在处理“细微错误”(如果您这样做)。如果这些API过度,您可以使用FileStreams。
无论哪种方式都有一堆小小的陷阱。例如,您应该知道何时有正在运行的硬链接,或者您将备份冗余数据......当您还原时,您不希望破坏这些链接。有获取给定文件的所有硬链接的API ...例如NtQueryInformationFile。
ReparsePoints(Junctions和SymLinks)也需要特殊处理......因为它们是低级重定向到其他文件位置。如果您不小心,可以在这些重新分析点之后的圈子中运行,甚至发现自己无意中备份了非体积数据。
不容易处理所有这些问题,但如果彻底性问题,你会在完成之前遇到它们。