备份大量文件而不枚举

时间:2017-04-21 19:51:45

标签: c# .net backup enumeration volume-shadow-service

.NET中是否有办法备份包含多个子目录的目录,每个子目录可能包含大约100kb-500kb大小的10,000个或更多文件而不进行枚举?这里的用例是逐步将文件备份到USB存储器和NAS,但由于文件计数,可能需要很长时间。我熟悉VSS,并创建了一些利用它的自定义备份应用程序,但我想知道是否有办法对包含这些文件的卷进行快照并仅保存快照,而不必将快照公开为已挂载的映像和副本每个文件。结束游戏是为了缩短复制操作所需的时间。

3 个答案:

答案 0 :(得分:1)

MFT(主文件表)记录仅为1K or 1,024 bytes in size,因此,与移动文件数据本身所需的读取相比,检索名称,属性等只需要一点点I / O.因此,枚举文件目录记录不是问题所在,并且消除那部分处理不会导致速度表上的微小闪烁,可以这么说。

我想您可以使用cloning software尝试磁盘数据本身的低级BIOS“克隆”(不是复制)。这可能会快一些,因为磁头不必锯齿绕。另一方面,如果您的硬盘处于固态状态,此选项几乎不会产生影响,因为随机访问将与顺序访问一样快。

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

答案 1 :(得分:1)

您可以从.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);
    }
}

答案 2 :(得分:1)

Windows Server Backup Feature可能是定制解决方案的一个很好的替代方案。如果您运行的是Windows Server 2016,则可能会发现此article解释了新功能。