2017-04-21 18 views
1

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

+0

您是否检查'ZipFile.CreateFromDirectory'的性能是否可以接受? –

+0

@EugeneKomisarenko - 我曾考虑过这个问题,我仍在仔细考虑。我可以将所有内容都归档到zip中,甚至可以从我理解的内容中追加。我不得不以某个频率重新创建存档,以确保我拥有最新版本的更改文件。我在我的问题中忽略了这可能会采取增量备份的形式。 – Smitty

回答

1

Windows Server Backup Feature可能是一个很好的选择,以定制的解决方案。如果您正在运行Windows Server 2016,您可能会发现这个article也解释了新功能。

+0

我会认真看待这个。它显然是块级别,因此比单个文件级别的操作更好。 – Smitty

+1

看起来我要走这条路。我发现我可以在哪里写一个.NET应用程序来调用一些[Windows Server Backup PowerShell](https://msdn.microsoft.com/en-us/library/gg241214(v = vs.85) .aspx)命令可以运行计划和'一次'备份。这是一个有吸引力的解决方案的原因是,Windows Server Backup利用卷影复制非常合适,因为一些文件一定会被读取锁定。此外,我只需要处理VHD映像,而不是从暴露的快照中复制单个文件。 – Smitty

1

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

我想你可以使用cloning software来尝试低级BIOS“克隆”(而不是复制)磁盘数据本身。这可能会更快一点,因为磁盘头不必曲折。另一方面,如果你的硬盘是固态的,这个选项几乎没有影响,因为随机存取的速度和顺序存取一样快。

另一种方法是仅备份已更改的文件,方法是检查每个文件的上次修改日期时间戳。执行此操作的简单方法是将XCOPY命令与/D开关(不带参数)一起使用,该开关将比较上次备份的日期/时间与当前文件,并且仅在硬盘上的文件较新时才执行复制比外部驱动器上的文件要多。

+0

所以这是真正的复制操作,需要时间,而不是枚举。感谢您的澄清 - 我听说过xcopy和robocopy,但是使用FileSystemWatcher开发了一些内容来捕获目录及其子目录中的更改事件。我会看看我是否不能重新发明轮子。 – Smitty

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); 
    } 
}