File.Copy需预创建目标目录、显式控制覆盖、避免阻塞及内存溢出。应先用Directory.CreateDirectory确保路径存在,Path.Combine拼接路径,显式传overwrite参数,大文件用流式复制并支持进度与取消,关键文件先备份再覆盖。

直接用 File.Copy 就行,但不处理异常、不判断目标目录是否存在、不覆盖控制,就一定会出问题。
为什么 File.Copy 一跑就报“找不到路径的一部分”
这不是文件不存在,而是目标文件夹(父目录)压根没创建。比如想复制到 C:\backup\2024\config.txt,但 C:\backup\2024\ 这个路径根本不存在。
- 必须在调用
File.Copy前,用Directory.CreateDirectory确保目标目录存在(它会自动跳过已存在的目录) - 不要用
Directory.Exists+Directory.Create组合——多一次 IO,且有竞态风险 - 路径字符串建议统一用
Path.Combine拼接,避免手动加反斜杠出错
File.Copy 的第三个参数 overwrite 到底怎么选
这个布尔值决定目标文件已存在时是否覆盖。设为 false(默认)时,如果目标文件存在,直接抛 IOException;设为 true 会静默覆盖——但不会帮你备份旧文件,也不会校验内容一致性。
- 生产环境建议显式传
true或false,别依赖默认值,代码可读性更强 - 如果需要“仅当源文件更新时才覆盖”,得自己比对
FileInfo.LastWriteTime,File.Copy不提供该逻辑 - 覆盖操作不可逆,关键文件建议先
File.Move备份原文件(如重命名为config.txt.bak)再复制
大文件复制卡死或没进度?别硬等 File.Copy
File.Copy 是同步阻塞调用,不提供进度回调,也不支持取消。几 GB 的文件一卡就是几十秒,UI 线程会冻结,用户以为程序崩了。
- 需要进度或可取消,必须手动流式复制:用
FileStream打开源和目标,配合BufferedStream和固定大小 buffer(如 8192 字节)循环Read/Write - 每写完一个 buffer,可以更新 UI 或检查
CancellationToken - 记得用
using确保流及时释放,否则句柄泄漏会导致后续复制失败 - 别用
File.ReadAllBytes+File.WriteAllBytes处理大文件——会把整个文件读进内存,OOM 风险极高
真正麻烦的从来不是“怎么复制”,而是“复制失败时要不要重试”“源文件被其他进程锁住怎么办”“网络路径权限不足怎么提示更友好”——这些细节没兜住,File.Copy 写得再短也没用。










