C# 使用.NET进行文件备份的最佳方法

C# 使用.NET进行文件备份的最佳方法,c#,.net,file,copy,backup,C#,.net,File,Copy,Backup,有许多可能的解决方案可用于执行文件备份应用程序。我需要知道哪种方法是执行数据文件复制的可靠且专业的方法,即使该文件正在使用或非常大。 有一种称为卷影复制(VSS)的已知方法,但我已经了解到,对于简单的复制操作来说,这是一种过度杀伤力,可以使用PInvoke BackupRead。 .NET framework提供了自己的方法: File.Copy在和方面有问题(可能仍然有问题) FileStream似乎适合用于备份目的,但我没有找到全面的描述,也不确定我是否正确 你能告诉我应该使用哪种方法吗(也

有许多可能的解决方案可用于执行文件备份应用程序。我需要知道哪种方法是执行数据文件复制的可靠且专业的方法,即使该文件正在使用或非常大。

有一种称为卷影复制(VSS)的已知方法,但我已经了解到,对于简单的复制操作来说,这是一种过度杀伤力,可以使用PInvoke BackupRead。

.NET framework提供了自己的方法:
File.Copy
在和方面有问题(可能仍然有问题)
FileStream
似乎适合用于备份目的,但我没有找到全面的描述,也不确定我是否正确

你能告诉我应该使用哪种方法吗(也许我忽略了一些选项)以及为什么?如果首选VSS或PInvoke方法,请您也提供一个如何使用它的示例,或者提供一些对全面文档的参考(特别是我对创建文件句柄的正确设置感兴趣,这将允许在使用文件时共享资源)。


提前感谢。

在live(即当前运行的操作系统)卷中尝试的所有内容都会因无法打开某些文件而受到影响。原因是,应用程序和操作系统本身以独占方式打开文件,也就是说,它们以ShareMode=0的方式打开文件。你将无法读取这些文件

VSS与支持VSS的应用程序协商,以在整个过程中释放其打开的文件,但Microsoft以外的应用程序支持VSS的相对较少

另一种方法是引导到另一个操作系统(在U盘或另一个磁盘卷上),然后从那里开始工作。例如,您可以使用Microsoft预安装环境(WinPE)。您可以通过一些努力从那里运行.NET4.x应用程序。在这样的环境中,您几乎可以访问目标卷上的任何文件,而无需共享冲突

WinPE以本地管理员身份运行。因此,您需要声明特权,例如SE_备份名称、SE_还原名称、SE_安全名称、SE_获取所有权名称,并且您需要使用名为BACKUP_SEMANTCS的标志打开文件…如前所述

BackupRead/BackupWrite API是有效的(如果不方便的话)。您不能在这些API中使用异步文件句柄……或者,如果您这样做,至少MS声称您会遇到“细微错误”。如果这些API过于苛刻,您可以只使用文件流

无论哪种方式,都会有一堆小怪兽。例如,您应该知道何时有硬链接在使用中,或者您将备份冗余数据……当您恢复时,您不想中断这些链接。有一些API可以获取给定文件的所有硬链接……例如,NtQueryInformationFile

重解析点(连接和符号链接)也需要特殊处理…因为它们是指向其他文件位置的低级重定向。如果不小心,您可以在这些重分析点之后循环运行,甚至会发现自己无意中备份了卷数据


处理所有这些东西并不容易,但如果彻底性是一个问题,那么在完成之前,您会遇到所有这些问题。

您可以创建一个启动Robocopy的流程谢谢提示:)但是,Robocopy还不够好,因为它无法复制打开的文件。谢谢您的回答。操作系统不能处理文件共享模式的问题吗?问题是,如果您需要每天(即每晚)设置备份,您不希望运行WinPE之类的程序。就我所测试的而言,卷影复制似乎工作正常。我错了吗?没关系。我只是将BackupRead/Write与FileCopy进行对比,并确定卷上存在的结构问题。VSS在大多数情况下都可以。我们使用win pe是因为我们在备份中有更严格的取证要求(我从事企业备份/恢复)