文件隐藏属性导致File.Copy抛出UnauthorizedAccessException异常
这是Windows和.NET的预期行为,并非bug
这个现象是Windows文件系统权限模型和.NET File.Copy()方法的既定设计,不是长期存在的bug,核心原因如下:
- .NET的
File.Copy()底层调用Windows原生的CopyFileEx等Win32 API,这些API默认会拦截对带有Hidden属性的目标文件的覆盖操作。这是Windows文件系统的防护逻辑:隐藏文件通常被标记为"不应被意外修改"的对象,因此覆盖操作需要显式处理属性后才能执行,和权限不足、只读属性的限制逻辑完全独立。 - 该行为和Windows资源管理器的操作逻辑一致:在资源管理器中尝试覆盖隐藏文件时,系统会弹出确认对话框而非直接执行,本质是同一个底层规则的体现。
- 虽然早期.NET官方文档未明确标注这个细节,但该行为从.NET Framework 2.0时代就存在,一直延续到.NET 8等新版本,属于跨版本的既定设计。
解决方案:显式处理隐藏属性
如果需要自动覆盖隐藏文件,可以在复制前先移除目标文件的隐藏属性,完成复制后按需恢复:
string sourcePath = @"C:\source.txt"; string targetPath = @"C:\target_hidden.txt"; // 获取目标文件当前属性 var targetAttrs = File.GetAttributes(targetPath); // 移除隐藏属性(如果存在) if ((targetAttrs & FileAttributes.Hidden) != 0) { File.SetAttributes(targetPath, targetAttrs & ~FileAttributes.Hidden); } // 执行覆盖复制 File.Copy(sourcePath, targetPath, overwrite: true); // 恢复目标文件原有的隐藏属性(可选) File.SetAttributes(targetPath, targetAttrs);
内容的提问来源于stack exchange,提问作者Alex Bousso
相关产品推荐
相关产品推荐

