You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用File.Copy向FAT/FAT32复制失败时目标文件为空,此现象是否正常?

关于File.Copy在FAT/FAT32文件系统空间不足时清空目标文件的问题

这个现象不属于.NET官方文档明确记录的预期行为,但本质是FAT/FAT32与NTFS文件系统的设计差异导致的必然结果。

背后的原因

  • NTFS文件系统支持事务性写入与回滚机制,当File.Copy因空间不足失败时,会自动回滚对目标文件的修改,保留原文件内容。
  • FAT/FAT32没有这类事务保障能力,当你使用带覆盖参数(第三个参数为true)的File.Copy时,执行逻辑是先清空目标文件,再尝试写入源文件数据。一旦中途因空间不足抛出IOException,已经被截断的目标文件无法恢复,最终变成0KB。

对应代码的执行流程

你使用的代码:

File.Copy(biggerFile, smallerFile, true);

在FAT/FAT32下的执行步骤:

  1. 打开目标文件smallerFile并将其截断为0字节(清空原有内容)
  2. 尝试读取源文件biggerFile的数据写入目标文件
  3. 因目标驱动器空间不足触发IOException,但此时目标文件已经被清空,无法回滚

规避建议

如果需要避免目标文件被清空的情况,可以:

  • 复制前先检查目标驱动器的剩余空间是否大于源文件大小
  • 先将源文件复制到目标驱动器的临时文件,复制成功后再替换原目标文件

内容的提问来源于stack exchange,提问作者Chuck Norris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:00:59