使用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下的执行步骤:
- 打开目标文件
smallerFile并将其截断为0字节(清空原有内容) - 尝试读取源文件
biggerFile的数据写入目标文件 - 因目标驱动器空间不足触发
IOException,但此时目标文件已经被清空,无法回滚
规避建议
如果需要避免目标文件被清空的情况,可以:
- 复制前先检查目标驱动器的剩余空间是否大于源文件大小
- 先将源文件复制到目标驱动器的临时文件,复制成功后再替换原目标文件
内容的提问来源于stack exchange,提问作者Chuck Norris
相关产品推荐
相关产品推荐

