无需枚举即可备份大量文件
Backup large number of files without enumerating
.NET 中是否有一种方法可以在不枚举的情况下备份包含多个子目录的目录,每个子目录可能包含 10,000 个或更多大小约为 100kb-500kb 的文件?这里的用例是将文件增量备份到 USB 存储和 NAS,但由于文件数量,这可能需要很长时间。我熟悉 VSS 并使用它创建了一些自定义备份应用程序,但我想知道是否有一种方法可以对包含这些文件的卷进行快照并仅保存快照,而不必将快照公开为已安装的映像并复制每个文件。结束游戏是为了缩短复制操作所花费的时间。
一个MFT(master file table)记录只有1K or 1,024 bytes in size,所以检索名称、属性等与读取相比只需要一点点I/O需要移动文件数据本身。因此,枚举文件目录记录不是问题,可以说,消除这部分处理不会导致速度表出现微小的闪烁。
我想您可以使用 cloning software 尝试磁盘数据本身的低级 BIOS "clone"(不是复制)。这可能会快一点,因为磁盘磁头不必曲折移动。另一方面,如果你的硬盘是固态的,这个选项几乎没有效果,因为随机访问和顺序访问一样快。
另一种选择是通过检查每个文件的最后修改日期时间戳来仅备份已更改的文件。一个简单的方法是使用 XCOPY 命令和 /D
开关(不带参数),它将比较上次备份的 date/time 和当前文件,并且只执行如果硬盘上的文件比外部驱动器上的文件新,请复制。
您可以从 .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 Backup Feature might be a good alternative to custom built solutions. If you are running Windows Server 2016 you may find this article 解释新功能也很有趣。
.NET 中是否有一种方法可以在不枚举的情况下备份包含多个子目录的目录,每个子目录可能包含 10,000 个或更多大小约为 100kb-500kb 的文件?这里的用例是将文件增量备份到 USB 存储和 NAS,但由于文件数量,这可能需要很长时间。我熟悉 VSS 并使用它创建了一些自定义备份应用程序,但我想知道是否有一种方法可以对包含这些文件的卷进行快照并仅保存快照,而不必将快照公开为已安装的映像并复制每个文件。结束游戏是为了缩短复制操作所花费的时间。
一个MFT(master file table)记录只有1K or 1,024 bytes in size,所以检索名称、属性等与读取相比只需要一点点I/O需要移动文件数据本身。因此,枚举文件目录记录不是问题,可以说,消除这部分处理不会导致速度表出现微小的闪烁。
我想您可以使用 cloning software 尝试磁盘数据本身的低级 BIOS "clone"(不是复制)。这可能会快一点,因为磁盘磁头不必曲折移动。另一方面,如果你的硬盘是固态的,这个选项几乎没有效果,因为随机访问和顺序访问一样快。
另一种选择是通过检查每个文件的最后修改日期时间戳来仅备份已更改的文件。一个简单的方法是使用 XCOPY 命令和 /D
开关(不带参数),它将比较上次备份的 date/time 和当前文件,并且只执行如果硬盘上的文件比外部驱动器上的文件新,请复制。
您可以从 .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 Backup Feature might be a good alternative to custom built solutions. If you are running Windows Server 2016 you may find this article 解释新功能也很有趣。