C#递归删除只读文件 C#如何强制删除包含只读文件的文件夹-C#.Net教程

directory.delete(path, true) 会失败,因为 windows api 的 deletefile 拒绝删除带 file_attribute_readonly 标志的文件,即使递归参数为 true 也不会自动清除只读属性;必须先遍历所有文件和子目录(从内到外),用位运算清除只读位(保留其他属性),再执行删除。

为什么 Directory.Delete(path, true) 会失败

因为 .NET 的 Directory.Delete 默认调用 Windows API 的 DeleteFile,而该 API 拒绝删除带有 FILE_ATTRIBUTE_READONLY 标志的文件。即使你传了 true(递归),它也不会自动清除只读属性——它只是逐个尝试删,遇到只读文件就抛 UnauthorizedAccessException 或 IOException。

必须先遍历并清除只读属性

核心思路:不能依赖“强制删除”参数,得手动把所有文件和子目录的只读位去掉。注意两点:一是属性修改要从里往外(先子项后父项),二是目录本身也可能被设为只读(比如 Git 创建的空目录)。

实操建议:

  • 用 Directory.GetFiles(path, "*", SearchOption.AllDirectories) 获取全部文件路径,逐个调用 File.SetAttributes(file, File.GetAttributes(file) & ~FileAttributes.ReadOnly)
  • 再用 Directory.GetDirectories(path, "*", SearchOption.AllDirectories) 获取所有子目录(按深度降序排列),对每个目录执行同样操作:Directory.SetAttributes(dir, Directory.GetAttributes(dir) & ~FileAttributes.ReadOnly)
  • 最后才调用 Directory.Delete(path, true)

更安全的写法:用 FileAttributes 位运算而非直接赋值

别用 File.SetAttributes(file, FileAttributes.Normal) ——这会清掉隐藏、系统等其他属性,可能破坏程序或系统行为。正确做法是只清除只读位,保留其余属性不变:

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C#递归删除只读文件 C#如何强制删除包含只读文件的文件夹-C#.Net教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995389+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1391+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 3995389+
  • 本周更新: 0+
  • 最后更新: 2026-03-16