如何最快移动指定文件?简化批量覆盖移动*.bk文件代码及提速
简化代码并提升文件移动效率的方案
嘿,你的代码已经能完成任务了,但确实有不少可以精简和提速的空间,我来一步步帮你优化:
一、先把代码做精简
你的代码里有几个可以简化的点:
- 避免手动拼接路径:始终用
Path.Combine来处理路径拼接,减少拼写错误,代码更干净 - 无需判断目录是否存在:
Directory.CreateDirectory方法如果目标目录已经存在,不会抛出异常,直接跳过创建,所以可以删掉那层if判断 - 直接覆盖文件,不用先删除:在.NET Core 3.0+、.NET 5+及以后的版本中,
File.Move新增了支持覆盖的重载参数,不用手动判断文件是否存在再删除
简化后的代码如下:
var startingPath = @"D:\test\Jobs"; var destPath = Path.Combine(@"D:", DateTime.Today.ToString("dd-MM-yyyy")); // 直接创建目录,存在则跳过 Directory.CreateDirectory(destPath); // 遍历所有*.bk文件(延迟加载,适合大量文件) foreach (var file in Directory.EnumerateFiles(startingPath, "*.bk", SearchOption.AllDirectories)) { var destFile = Path.Combine(destPath, Path.GetFileName(file)); // 直接移动并覆盖已存在的文件 File.Move(file, destFile, overwrite: true); }
对比原来的代码,去掉了冗余的路径拼接和判断逻辑,可读性和简洁性都提升了不少。
二、提升运行速度
如果要处理的文件数量非常多,可以从以下两点优化:
- 用
Directory.EnumerateFiles代替Directory.GetFiles:前者是延迟加载,不会一次性把所有文件路径加载到内存中,处理大量文件时内存占用更低,启动速度更快 - 并行处理文件移动:用
Parallel.ForEach代替普通foreach,可以同时处理多个文件移动操作,充分利用多核CPU资源(注意:如果目标目录有大量重名文件,并行时可能会有轻微的竞争,但因为我们用了overwrite: true,整体影响不大)
提速后的示例代码:
var startingPath = @"D:\test\Jobs"; var destPath = Path.Combine(@"D:", DateTime.Today.ToString("dd-MM-yyyy")); Directory.CreateDirectory(destPath); // 并行遍历并移动文件 Parallel.ForEach(Directory.EnumerateFiles(startingPath, "*.bk", SearchOption.AllDirectories), file => { var destFile = Path.Combine(destPath, Path.GetFileName(file)); File.Move(file, destFile, overwrite: true); });
注意事项
如果你的项目基于.NET Framework(而非.NET Core/.NET 5+),File.Move没有覆盖重载,这时候可以把覆盖逻辑简化成一行:
File.Copy(file, destFile, overwrite: true); File.Delete(file);
(因为.NET Framework中File.Copy支持覆盖,复制后删除原文件也能达到“移动并覆盖”的效果)
内容的提问来源于stack exchange,提问作者Bumba
相关产品推荐
相关产品推荐

