同时设置 FileAttributes.Hidden 和 FileAttributes.System 才能真正隐藏目录,仅设 Hidden 会被用户选项暴露,单设 System 可能误判;必须用 Directory.SetAttributes() 设置并按位清除,而非 Process.Start 或 FileAttributes.Normal。

用 FileAttributes.Hidden + FileAttributes.System 才算真正“不被发现”
单纯设 FileAttributes.Hidden 没用——Windows 资源管理器默认就显示隐藏项,只要用户勾了“显示隐藏的文件和文件夹”,你的文件夹立刻暴露。真想降低可见性,必须叠加 FileAttributes.System。系统属性会让 Explorer 默认彻底忽略该目录(连勾选设置都看不到它),这才是实际生效的关键组合。
- 只设
FileAttributes.Hidden→ 用户开个选项就看见 - 只设
FileAttributes.System→ 可能被部分工具误判为系统损坏项,不推荐单独用 - 两者同时设 → Explorer 默认不渲染、不列出、不索引,普通用户基本找不到
- 注意:管理员权限不是必须的,但目标路径需有写权限;若在受控环境(如 OneDrive 同步目录),可能被客户端自动重置属性
Directory.SetAttributes() 是唯一可靠方式,别用 Process.Start("attrib")
调用 cmd 的 attrib 命令看似简单,但存在路径空格转义失败、编码乱码、异步执行难捕获错误等问题。而 Directory.SetAttributes() 是 .NET 原生封装,稳定、同步、异常明确,直接操作 NTFS 属性位,没有中间层失真。
- 正确写法:
Directory.SetAttributes(@"C:\MySecret", FileAttributes.Hidden | FileAttributes.System);
- 错误写法:
Process.Start("cmd", @"/c attrib +H +S ""C:\MySecret""");—— 失败时不抛异常,也拿不到退出码 - 如果目录不存在,
Directory.SetAttributes()会直接抛DirectoryNotFoundException,必须提前检查或包裹try/catch
还原时必须显式清除两个标志,不能只清 Hidden
很多人还原时只写 FileAttributes.Normal,结果目录还是“看不见”——因为 FileAttributes.Normal 是 0,它不会“减去”已有的 System 位,而是直接覆盖全部属性。这会导致原 System 属性残留,目录依旧不可见。正确做法是用按位与取反,精准清除指定标志。
- 错误还原:
Directory.SetAttributes(path, FileAttributes.Normal);→ 系统属性没被清掉 - 正确还原:
var attr = Directory.GetAttributes(path);<br>Directory.SetAttributes(path, attr & ~(FileAttributes.Hidden | FileAttributes.System));
- 漏掉
FileAttributes.System的清理,后续哪怕改名、复制,新路径仍继承该属性(NTFS 继承机制)
Explorer 不刷新?不是代码问题,是缓存机制导致的假象
调用成功后,在资源管理器里看不到变化,大概率不是代码失效,而是 Explorer 的 shell 缓存没更新。它不会实时监听 NTFS 属性变更,需要手动触发刷新或等待几秒。这不是 bug,是 Windows 的设计行为。
- 临时验证是否生效:在 PowerShell 里运行
Get-Item "C:\MySecret" | Select-Object Attributes,看输出是否含Hidden, System - 强制 Explorer 刷新:按
F5或切换到其他文件夹再切回来 - 更彻底验证:注销再登录,或重启 Explorer 进程(任务管理器 → 重启
explorer.exe) - 注意:某些第三方文件管理器(如 Total Commander)可能不识别
System属性,它们仍会显示该目录
Normal 就等于埋了个隐形陷阱——目录还在,只是谁也找不着。










