文件系统路径和 Directory.Exists()

Posted

技术标签:

【中文标题】文件系统路径和 Directory.Exists()【英文标题】:File system paths and Directory.Exists() 【发布时间】:2011-09-30 05:59:37 【问题描述】:

我对这个有点茫然……似乎无法理解发生了什么。

我有一个应用程序将一些文件写入配置的输出目录,但在此之前,当应用程序加载时我会这样做......

string path = ConfigurationManager.AppSettings["TempDir"];
if (!Directory.Exists(path))
    Directory.CreateDirectory(path);

我的问题是,在我的情况下,路径是基于网络的位置“\MyServer\Share”,当我使用该路径时它可以工作,但我使用的路径实际上是“Z:\”,因为共享是映射并在网络上的所有用户会话中自动映射。

我想使用“Z:\”,但它无法返回错误提示“全部或部分路径不存在”。

我立刻想到“哦,这一定是权限”,所以我对照说“G:\”检查了它,它有效并且应用了相同的权限......

对于所有有问题的共享,我的用户帐户对该位置具有完全控制权限。

最初我认为它可能是这样的:Directory.Exists not getting mapped directory 但是后来我想起了该应用程序不可能在另一个帐户下运行,因为我检查并

    它只是一个控制台应用程序

    前一行是这样的:

    AppDomain.CurrentDomain.SetThreadPrincipal(new WindowsPrincipal(WindowsIdentity.GetCurrent()));
    

.. 据我了解,这样做的目的是确保 appdomain 在当前 Windows 用户的上下文中运行,包括所有“在 app 域中创建的线程”,除非另有说明

有什么想法吗?

编辑:

按照 Richard 的建议查看进程监视器(请参阅下面的 cmets)表明,如果我使用完整的 unc 路径“\MyServer\Share”,则如果我使用映射路径“Z:\”,则请求将按照我的预期发出它仍然请求完整的 unc 路径“\MyServer\Share”(大概是在 .net 的内部工作中进行某种形式的翻译)。

所以无论我请求什么完整的 unc 路径“\MyServer\Share”,但只有明确指定完整的 unc 路径,我才能访问它...奇怪!!!

上面发布的代码与我在控制台应用程序中编写的完全一样,除了那个原则性的事情之外,没有其他事情发生,因为这些是在我的控制台应用程序中执行的第一行代码。

嗯……

编辑 2:

好的,现在我真的很困惑,当在上面的配置文件请求行上放置一个断点并将其运行到断点然后清除进程监视器并跳过它,并且 if 语句没有出现在进程监视器中,因为我会期望它...

为什么会这样?

【问题讨论】:

Process Monitor 显示应用程序在做什么? 好问题...给我 2 分钟时间检查一下 你有linked connections的问题吗? Less verbose version. 嗯,有趣的 GSerg,您可能会有所收获。 好的,我关闭了 UAC 并尝试在没有调试器的情况下自行执行应用程序...... UAc 对结果没有影响,但在 Visual Studio 之外执行应用程序表明它确实请求unc 路径 .. 奇怪的是它在调试时没有,但你不觉得吗??? 【参考方案1】:

您不能将映射驱动器用作创建共享目录并为其授予所需权限(读取或写入)然后像这样连接到它所需的路径: \ServerName\SharedDirectoryName\OneMoreDirectory

【讨论】:

技术上我应该能够让应用程序使用我给它的任何路径,假设应用程序在我的凭据下运行并且拥有我拥有的所有访问权限......请解释为什么你觉得我可以'不使用映射驱动器? ...它仍然解析为幕后的完整 UNC 路径,正如进程监视器似乎显示的那样。 问题是驱动器映射到您的用户名。除非您在映射驱动器不存在的用户帐户下启动服务。通常,该服务在本地系统帐户下启动。您在这里有两个选择。首先是在您的用户帐户下启动服务(由于某种原因它并不总是对我有用)。其次是使用完整的 UNC 路径而不是映射的驱动器路径。 这是一个控制台应用程序,我已经声明我明确告诉应用程序域在我的凭据下运行(请参阅上面的主体使用点)......而且 UNc 路径在运行时动态解析。 【参考方案2】:

我似乎在调试工具/.net 框架中发现了一个奇怪的错误... 当调试器附加到我的应用程序时,它会失败,当调试器未附加时,它会按预期工作。

建议始终使用完整的 unc 路径,但对 Directory.Exists(path) 和 Directory.Delete(path) 的调用会在调用之前解析映射的驱动器,因为进程监视器显示因此尽管建议不需要这样做.

然而,我发现运行该应用程序然后手动附加 Visual Studio 似乎允许该应用程序按预期运行并允许在我的情况下进行需要调试。

此解决方案仅附带“适用于我的 PC 保证”...我对这个问题中所说的任何内容概不负责 :)

感谢大家的帮助,但我似乎已经解决了...... UAc 是很好的建议,流程监视器也是如此......谢谢大家......真的很有帮助:)

【讨论】:

以上是关于文件系统路径和 Directory.Exists()的主要内容,如果未能解决你的问题,请参考以下文章

判断文件路径和文件是否存在

Directory.Exists 用于 ASP.NET 中的网络路径

Test-Path / System.IO.Directory::Exists 未按预期工作

c#中如何检测文件路径是不是存在

C# 文件操作常用方法总结

下载指定路径的文件到本地服务器