C# 当目录不存在时,Exists返回true

C# 当目录不存在时,Exists返回true,c#,.net,windows-7,C#,.net,Windows 7,我正在为Windows 7开发一个应用程序,并运行一些例行的目录创建代码: string dirPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyDir"); if (!Directory.Exists(dirPath)) Directory.CreateDirectory(dirPath); 问题是当我无法通过命令行和Windows

我正在为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有什么我不知道的地方吗


编辑:添加了路径。合并

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


当然,如果Windows 7没有按我预期的方式运行Directory.Exists,那么可能它也没有运行裸目录.CreateDirectory。无论如何,它都值得测试。

CommonApplicationData
通常在Windows 7上解析为
\ProgramData
。这是一个隐藏文件夹。如果不要求资源管理器显示隐藏的文件和文件夹(从文件夹选项->查看UI),则在资源管理器中不会看到它


编辑:确保您在资源管理器中查看的目录正确:浏览到%PROGRAMDATA%,而不是C:\PROGRAMDATA。

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


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

Environment.GetFolderPath只接受一个参数,什么是MyDir?那么目录MyDir真的存在吗?或者只是因为你看不到它?我想缺少的(我假设)是对Path.Combine的调用,这会给他一个CommonApplicationData特殊文件夹的子目录MyDir。David-是的,你是对的。忘了从我的代码片段中复制它了。鲍比-我相信操作系统认为目录在那里,但我看不到它。这是我可以收集目录的唯一原因。Exists返回true。但是,它不是一个隐藏的文件夹,我可以通过Windows资源管理器访问c:\programdata.David-我想知道Directory.CreateDirectory上的这一点。但是,使用相同的文件夹路径运行Directory.CreateDirectory时,也不会创建目录。我意识到这是一个很难回答的问题,如果不能模拟环境,因此我可能必须继续做更多的研究。嗨,Michael-我可以看到C:\ProgramData,但我看不到它下面的目录。我以管理员的身份运行,如果有帮助的话。嗯。那样的话,我不知道。你的代码对我来说很好。我建议,考虑到您在编辑之前复制的代码不正确,您可以再次尝试,直接从您的问题复制代码。这可能与VM上运行的代码有关吗?我会发布原始代码,但它使用了另一个类,因此很难将其拼凑在一起。对此进行扩展:如果您以前试图从非提升进程创建MyDir,Windows会为您设置一个虚拟化副本。我相信,即使您检查目录,您也会继续看到此虚拟化副本。存在于提升的进程中。我认为这更接近于我需要的答案,但我检查了VirtualStore,但在那里没有看到MyDir。你有关于提升流程的文章吗?我不熟悉这个概念。此外,您可以利用Process Monitor检查应用程序实际要访问的文件夹,以了解MyDir的位置。()玩玩它,你会发现它很棒。你可以从MSDN更好地理解UAC for Windows Vista和Windows 7。大多数人对虚拟化感到困惑,但一旦您熟悉虚拟化,就可以轻松地与之抗争:)