有许多可能的解决方案来备份文件应用程序。我需要知道哪种方法是坚如磐石的专业方式来执行数据文件的复制,即使文件正在使用或非常大
有一种已知的方法称为卷影复制(VSS),但我读到,对于简单的复制操作来说,这是一种过度的方法,可以使用PInvoke BackupRead
.NET框架提供了自己的方法:File.Copy
在大文件和共享资源方面曾经(现在可能仍然)存在问题FileStream
似乎适合用于备份目的,但我没有找到全面的描述,我不确定我是否正确。
你能告诉我应该使用哪种方法吗(也许我忽略了一些选项),为什么?如果首选VSS或PInvoke方法,请您也提供一个如何使用它的示例,或参考全面的文档(特别是我对创建文件句柄的正确设置感兴趣,这将允许在使用文件时共享资源)
提前谢谢。
在实时(即当前运行的操作系统)卷中尝试的所有操作都将因无法打开某些文件而受到影响。原因是,应用程序和操作系统本身以独占方式打开文件,也就是说,它们打开的文件的ShareMode为0。你将无法读取这些文件。
VSS与支持VSS的应用程序协商,以便在这段时间内释放其打开的文件,但在Microsoft之外,很少有应用程序支持VSS。
另一种方法是引导到另一个操作系统(在U盘或另一个磁盘卷上),然后从那里开始工作。例如,您可以使用Microsoft预安装环境(WinPE)。您可以在那里运行一个.Net 4.x应用程序。在这样的环境中,您几乎可以访问目标卷上的任何文件,而不会发生共享冲突。
WinPE以本地管理员身份运行。因此,您需要断言特权,如SE_BACKUP_NAME、SE_RESTORE_NAME、SE_SECURITY_NAME、SE_TAKE_OWERSHIP_NAME,并且您需要使用名为BACKUP_SEMANTCS的标志打开文件。。。如本文所述。
BackupRead/BackupWrite API是有效的,尽管有些笨拙。您不能将异步文件句柄与这些API一起使用。。。或者至少MS声称,如果你这样做了,你会遇到"微妙的错误"。如果这些API太夸张了,你可以直接使用FileStreams。
无论哪种方式,都会有一束束的小陷阱。例如,你应该知道什么时候有硬链接在发挥作用,否则你将备份冗余数据。。。当你恢复时,你不想破坏这些链接。有一些API可以获取给定文件的所有硬链接。。。例如NtQueryInformationFile。
重分析点(Junctions和SymLinks)也需要特殊处理。。。因为它们是到其他文件位置的低级重定向。如果你不小心,你可能会在这些重新分析点后面绕圈子跑,甚至会发现自己无意中备份了卷外的数据。
处理所有这些事情并不容易,但如果彻底性是一个问题,你会在完成之前遇到所有这些问题。