【问题标题】:Directory.Exists returns true when directory is not presentDirectory.Exists 在目录不存在时返回 true
【发布时间】:2009-11-12 17:14:05
【问题描述】:

我正在开发适用于 Windows 7 的应用程序,并运行一些常规目录创建代码:

string dirPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyDir");    
if (!Directory.Exists(dirPath))
   Directory.CreateDirectory(dirPath);

问题是当我无法通过命令行和 Windows 资源管理器查看目录时,Directory.Exists 行返回 true。使用 Windows XP 时,这不是问题。 Windows 7 是否发生了一些我不知道的事情?

编辑:添加 Path.Combine

【问题讨论】:

  • Environment.GetFolderPath 只接受一个参数,MyDir 是什么?
  • 那么目录 MyDir 真的存在吗?还是只是你看不到?
  • 我认为缺少的(我认为)是对 Path.Combine 的调用,这将为他提供 CommonApplicationData 特殊文件夹的子目录 MyDir。
  • 大卫 - 是的,你是对的。忘了从我的代码 sn-p 中复制它。
  • Bobby - 我相信操作系统认为目录在那里,但我看不到它。这是我可以收集到 Directory.Exists 返回 true 的唯一原因。但是,它不是隐藏文件夹,我可以通过 Windows 资源管理器访问 c:\programdata。

标签: c# .net windows-7


【解决方案1】:

请理解 Windows Vista 和 Windows 7 使用虚拟化来保护此类文件夹,因此您需要检查 myDir 是否在 virtualstore 中,

C:\Users(用户名)\AppData\Local\VirtualStore\ProgramData

【讨论】:

  • 进一步扩展:如果您之前尝试从非提升进程创建 MyDir,Windows 会为您设置一个虚拟化副本。我相信即使您从提升的进程中检查 Directory.Exists,您也会继续看到此虚拟化副本。
  • 我认为这更接近我需要的答案,但我在 VirtualStore 中检查并没有在那里看到 MyDir。你有一些关于提升过程的文章吗?我不熟悉这个概念。
  • 此外,您可以使用 Process Monitor 来检查您的应用程序试图访问的文件夹,以了解 MyDir 的位置。 (technet.microsoft.com/en-us/sysinternals/bb896645.aspx) 玩它,你会发现它很棒。
  • 您可以从 MSDN 更好地了解适用于 Windows Vista 和 Windows 7 的 UAC。 msdn.microsoft.com/en-us/library/bb756960.aspx 大部分人都对虚拟化感到困惑,但是一旦你熟悉了它,你就可以轻松应对:)
【解决方案2】:

我不知道为什么 Windows 7 会这样做,而且我没有要测试的副本,但是您对 Directory.Exists(path) 的检查应该没有必要。如果你(深入)反射到 Directory.CreateDirectory(path) 中,你会发现它在内部检查目录是否已经存在,并且在已经存在的目录上多次调用它不是问题。对 Directory.Exists(path) 的调用是多余且不必要的。

当然,如果 Windows 7 没有按照我期望的方式执行 Directory.Exists,也许它也没有执行裸 Directory.CreateDirectory。无论如何,它值得测试。

【讨论】:

  • David - 我想知道关于 Directory.CreateDirectory 的问题。但是,当使用相同的文件夹路径运行 Directory.CreateDirectory 时,也不会创建目录。我意识到如果不能模拟环境,这是一个很难回答的问题,所以我可能需要继续做更多的研究。
【解决方案3】:

CommonApplicationData 在 Windows 7 上通常解析为 <OSDrive>\ProgramData。这是一个隐藏文件夹。如果您不要求 Explorer 显示隐藏的文件和文件夹(通过 Folder Options->View UI),您将不会在 Explorer 中看到它。

编辑:确保您在 Explorer 中查看的是正确的目录:浏览到 %PROGRAMDATA%,而不是 C:\ProgramData。

【讨论】:

  • 嗨迈克尔 - 我可以看到 C:\ProgramData 但我看不到它下面的目录。我以管理员身份运行,如果有帮助的话。
  • 嗯。在那种情况下,我不知道。你的代码对我来说很好。鉴于您在编辑之前复制的代码不正确,我建议您再次尝试,直接从您的问题中复制代码。
  • 它可能与VM上运行的代码有关吗?我会发布原始代码,但它使用另一个类,因此很难拼凑起来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
相关资源
最近更新 更多