gpt4 book ai didi

c# - .net File.Copy 在复制许多小文件时非常慢(不是通过网络)

转载 作者:可可西里 更新时间:2023-11-01 12:41:09 31 4
gpt4 key购买 nike

我正在为自己制作一个简单的文件夹同步备份工具,但在使用 File.Copy 时遇到了很大的障碍。测试将包含约 44,000 个小文件(Windows 邮件文件夹)的文件夹复制到我系统中的另一个驱动器时,我发现使用 File.Copy 比使用命令行并运行 xcopy 来复制相同的文件/文件夹慢 3 倍以上。我的 C# 版本需要超过 16 分钟来复制文件,而 xcopy 只需要 5 分钟。我曾尝试搜索有关此主题的帮助,但我发现的只是人们提示通过网络复制大文件的速度很慢。这既不是大文件问题,也不是网络复制问题。

我找到了一个 interesting article about a better File.Copy replacement ,但是发布的代码有一些错误,导致堆栈出现问题,而且我的知识还不足以解决他的代码中的问题。

是否有任何常见或简单的方法可以用更快速的方法替换 File.Copy?

最佳答案

需要考虑的一件事是您的副本是否具有在复制过程中更新的用户界面。如果是这样,请确保您的副本在单独的线程上运行,否则您的 UI 将在复制过程中卡住,并且通过阻塞调用更新 UI 来减慢副本速度。

我编写了一个类似的程序,根据我的经验,我的代码运行速度比 Windows 资源管理器副本快(不确定命令提示符下的 xcopy)。

此外,如果您有一个 UI,请不要更新每个文件;而不是更新每 X 兆字节或每个 Y 文件(以先到者为准),这将更新量减少到 UI 实际可以处理的程度。我使用了每 .5MB 或 10 个文件;这些可能不是最佳选择,但它显着提高了我的复制速度和 UI 响应速度。

另一种加快速度的方法是使用 Enumerate 函数而不是 Get 函数(例如 EnumerateFiles 而不是 GetFiles)。这些函数会尽快开始返回结果,而不是等到列表构建完成后才返回所有内容。它们返回一个 Enumerable,因此您只需对结果调用 foreach:foreach(System.IO.Directory.EnumerateDirectories(path) 中的字符串文件)。对于我的程序,这在速度上也产生了显着差异,并且在像您这样处理包含许多文件的目录的情况下会更有帮助。

关于c# - .net File.Copy 在复制许多小文件时非常慢(不是通过网络),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11370566/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com