【问题标题】:Path generated via subst-command not found by System.IOSystem.IO 找不到通过 subst-command 生成的路径
【发布时间】:2016-12-01 00:58:21
【问题描述】:

上下文:

  • 系统有一个硬盘和一个驱动器(“C:\”)
  • 所需路径位于 F:\eventlogging

我做了什么:

  • 我执行了 subst cmd 以生成 F:\ 驱动器(来自 C:\)

  • 添加目录“eventlogging”

问题:

  • 在代码中,有些部分会写入 F:\eventlogging 内的文件
  • 抛出异常:System.IO.DirectoryNotFoundException:System.IO.DirectoryNotFoundException:找不到路径的一部分 'F:\eventlogging\'..

我尝试了什么:

  • 在资源管理器工作中输入路径(转到路径)
  • 在 cmd 中 cd 到此路径也可以正常工作

附加信息:

  • 无法更改代码(许多项目的通用基础)

【问题讨论】:

  • 您是否尝试过将 C 映射到 F 而不是 subst?虽然我将我的 C 映射到 E(因为 F 被拍摄)并且 Directory.Exists("E:\\inetpub\\") 为我工作。我在 Win7 上
  • @Pikoh:更改系统盘符将是一个真的坏主意。 :)
  • @Groo 你是绝对正确的!我不知道我在想什么:)

标签: c# .net


【解决方案1】:

如果您使用提升的提示映射驱动器,它将在非管理员帐户下不可见。

您可以以管理员身份运行程序,也可以使用对管理员和非管理员帐户都可见的不同方法。这包括将以下键添加到注册表(将以下行复制/粘贴到"temp.reg" 文件中,然后双击它):

REGEDIT4 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices] 
"F:"="\\??\\C:"

另一个好处是这种方法在重新启动后仍然有效。

注意:如果您打算使用 regedit.exe 手动添加密钥,请不要转义反斜杠(即将上述表达式中的每个 \\ 替换为 \),然后在这种情况下也没有引号(您可以在DOS Devices 键中添加一个新的String Value,将名称设置为F:,并将数据设置为\??\C:

你还需要重启系统才能生效。

另外:我知道你写了代码不能更改,但仍然应该强调:使用配置文件而不是硬编码路径显然是任何应用程序的正确方法(或者更简单,放置日志当前用户AppData\Local 文件夹内的某个位置)。使用默认设置为f:\eventlogging 重新构建这个公共基础不会破坏其他应用程序,但会让您拥有这种灵活性。代码中的所有其他硬编码设置和幻数也是如此。所有的日志框架都使用配置文件来配置它们的输出。

【讨论】:

  • 您好 Groo,感谢您的详细回答。我用提升的提示替换了驱动器,VS2015 也在提升运行......我会尝试第二种方法,并告诉你它是否有效:)
  • 工作,非常感谢!添加到 reg 做到了
猜你喜欢
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
相关资源
最近更新 更多