Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不枚举的情况下备份大量文件_C#_.net_Backup_Enumeration_Volume Shadow Service - Fatal编程技术网

C# 在不枚举的情况下备份大量文件

C# 在不枚举的情况下备份大量文件,c#,.net,backup,enumeration,volume-shadow-service,C#,.net,Backup,Enumeration,Volume Shadow Service,在.NET中是否有一种方法可以备份包含多个子目录的目录,每个子目录可能包含10000个或更多大小约为100kb-500kb的文件,而无需枚举?这里的用例是以增量方式将文件备份到USB存储和NAS,但由于文件计数的原因,这可能需要很长时间。我熟悉VSS,并使用它创建了一些自定义备份应用程序,但我想知道是否有一种方法可以对包含这些文件的卷进行快照并仅保存快照,而不必将快照作为装载的映像公开并复制每个文件。最终目的是缩短复制操作所需的时间。MFT(主文件表)记录是唯一的,因此检索名称、属性等只需要一点

在.NET中是否有一种方法可以备份包含多个子目录的目录,每个子目录可能包含10000个或更多大小约为100kb-500kb的文件,而无需枚举?这里的用例是以增量方式将文件备份到USB存储和NAS,但由于文件计数的原因,这可能需要很长时间。我熟悉VSS,并使用它创建了一些自定义备份应用程序,但我想知道是否有一种方法可以对包含这些文件的卷进行快照并仅保存快照,而不必将快照作为装载的映像公开并复制每个文件。最终目的是缩短复制操作所需的时间。

MFT(主文件表)记录是唯一的,因此检索名称、属性等只需要一点点的I/O,而移动文件数据本身所需的读取量则比较少。因此,枚举文件目录记录并不是问题,而消除这部分处理只会在车速表上引起一点闪烁

我想您可以尝试使用BIOS对磁盘数据本身进行低级别的“克隆”(而不是复制)。这可能会快一点,因为磁头不必曲折地旋转。另一方面,如果硬盘是固态的,这个选项几乎没有效果,因为随机访问和顺序访问一样快


另一个选项是通过检查每个文件上次修改的日期时间戳,仅备份已更改的文件。一种简单的方法是使用带有
/D
开关的命令(无参数)它会将上次备份的日期/时间与当前文件进行比较,并且仅当硬盘上的文件比外部驱动器上的文件新时才执行复制。

您可以调用.Net中的其他进程,并使用RoboCopy将文件移动到不同的位置。它有很多参数,比如指定要使用的线程数,或者时间戳检查等

public static void Main()
{
    Process myProcess = new Process();

    try
    {
        myProcess.StartInfo.UseShellExecute = false;
        myProcess.StartInfo.FileName = "C:\\Windows\\System32\\robocopy.exe Source Destination";
        myProcess.StartInfo.CreateNoWindow = true;
        myProcess.Start();
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

可能是定制解决方案的一个很好的替代方案。如果您正在运行Windows Server 2016,您可能会发现这也解释了一些有趣的新功能。

您是否检查了
ZipFile.CreateFromDirectory
的性能是否可以接受?@EugeneKomisarenko-我实际上已经考虑过了,现在还在仔细考虑。我可以将所有内容归档到zip中,甚至根据我的理解添加到zip中。我必须以一定的频率重新创建档案,以确保我有最新版本的修改过的文件。我在问题中忽略了这可能采取增量备份的形式,因此真正需要时间的是复制操作,而不是枚举。感谢您的澄清——我听说过xcopy和robocopy,但已经开发了一些东西,使用FileSystemWatcher捕捉目录及其子目录中的更改事件。我会看看我是否能重新发明轮子。我会认真考虑的。它显然是块级的,所以比单独的文件级操作要好。看起来我要走这条路了。我发现我可以在哪里编写一个小小的.NET应用程序来调用一些可以运行定时备份和“一次性”备份的命令。这是一个有吸引力的解决方案的原因是,Windows Server Backup使用卷影复制,这非常适合,因为某些文件肯定会被读取锁定。另外,我只需要处理一个VHD映像,而不需要从公开的快照复制单个文件。