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

时间:2011-07-07 07:50:00

标签: c# .net permissions file-permissions

我在这一点上有点失落......似乎无法理解发生了什么。

我有一个应用程序将一些文件写入已配置的输出目录,但在此之前,当应用程序加载时我执行此操作...

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

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

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

我立刻想到“哦,这必须是权限”,所以我检查了它说“G:\”哪个有效并且具有相同的权限...

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

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

  1. 它唯一的控制台应用
  2. 之前的一行是这样的:

    AppDomain.CurrentDomain.SetThreadPrincipal(new WindowsPrincipal(WindowsIdentity.GetCurrent()));
    
  3. ..据我所知,这是为了确保appdomain在当前windows用户的上下文中运行,包括所有“在app域内创建的线程”,除非另有说明

    有什么想法吗?

    编辑:

    通过理查德建议查看过程监视器(请参阅下面的评论)显示,如果我使用完整的非路径“\ MyServer \ Share”,则按照我的预期进行请求,如果我使用映射路径“Z:\”它仍然请求完整的unc路径“\ MyServer \ Share”(可能是它在.net的内部工作中进行某种形式的翻译)。

    所以无论我要求一个完整的路径“\ MyServer \ Share”,但只有通过明确指定完整的路径才能访问它...很奇怪!!!

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

    嗯...

    编辑2:

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

    为什么会这样?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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

此解决方案仅附带“我的电脑上的作品保证”......我对此问题中的任何内容不承担任何责任:)

感谢大家的帮助,但我似乎已经解决了...... UAc是一个很好的建议,过程监控也是如此......谢谢你们......真的很有帮助:)

相关问题