【问题标题】:Odd C# path issue奇怪的 C# 路径问题
【发布时间】:2012-10-08 09:20:13
【问题描述】:

我的 C# 应用程序将其用双引号括起来的完整路径写入文件,其中:

streamWriter.WriteLine("\"" + Application.ExecutablePath + "\"");

正常运行,写入文件包含

"D:\Dev\Projects\MyApp\bin\Debug\MyApp.exe"

但是,如果我的应用程序的可执行路径包含#,就会发生一些奇怪的事情。输出变为:

"D:\Dev\Projects#/MyApp/bin/Debug/MyApp.exe"

# 之后的斜杠变为正斜杠。这会导致我正在开发的系统出现问题。

为什么会发生这种情况,有没有比字符串更优雅的方法来防止它。在写入之前替换路径?

【问题讨论】:

  • 我无法重现这个。我的应用程序从 C:\my#\project\foo.exe 运行,它正确地写出 Application.ExecutablePath,正如您在上面所写的那样。调试时 Application.ExecutablePath 是否正确检查?您是否对此处未显示的文字进行任何后期处理?
  • 我在一个新项目中重新测试了它,只有编写文件的代码。它仍然重现。如果这有什么不同的话,它使用的框架是 4.5。
  • 很有趣,尤其是在下面 Elian 的帖子中。想知道我做了什么不同(尽管我使用的是 4.0 框架...)

标签: c# c string path slash


【解决方案1】:

我刚刚查看了Application.ExecutablePath的源码,实现基本上是这样的*:

Assembly asm = Assembly.GetEntryAssembly();
string cb = asm.CodeBase;
var codeBase = new Uri(cb); 

if (codeBase.IsFile) 
    return codeBase.LocalPath + Uri.UnescapeDataString(codeBase.Fragment);
else
    return codeBase.ToString();

Assembly.CodeBase 属性会将位置作为 URI 返回。比如:

file:///C:/myfolder/myfile.exe

# 是 URI 中的片段标记;它标志着片段的开始。显然,Uri 类在解析并再次转换回字符串时会更改给定的 uri。

由于Assembly.Location 包含“正常”文件路径,我想您最好的选择是:

string executablePath = Assembly().GetEntryAssembly().Location;

*) 实现比这更复杂,因为它还处理有多个应用程序域的情况和其他特殊情况。我为最常见的情况简化了代码。

【讨论】:

  • 有趣的问题.. 无论如何,我转换为 Assembly.Location 并解决了。谢谢你:)
【解决方案2】:

奇怪的错误/错误。除了使用替换函数或扩展方法来始终返回正确的格式之外,您可以尝试使用

System.Reflection.Assembly.GetExecutingAssembly().Location 

而不是 ExecutablePath。

【讨论】:

    猜你喜欢
    • 2012-02-19
    • 1970-01-01
    • 2013-04-14
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多