2012-10-18 46 views
18

我的C#應用​​程序寫入其用雙引號包圍完整路徑的文件,用:奇C#路徑問題

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

通常情況下它的工作原理,在書面文件中包含

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

但是,如果我的應用程序的可執行路徑包含#,發生了一些奇怪的事情。輸出變爲:

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

#成爲正斜槓後的斜線。這會導致我正在開發的系統出現問題。

爲什麼會發生這種情況,是否有辦法阻止它比字符串更優雅?在寫入之前替換路徑?

+0

我不能重現這一點。我有我的應用程序從C:\ my#\ project \ foo.exe運行,它正確寫出了上面寫的Application.ExecutablePath。當您調試Application.ExecutablePath檢查正確嗎?您是否對您寫出的文字進行任何後期處理? – Joe

+2

我在一個新項目中重新測試了它,只用編寫該文件的代碼。它仍然重現。它使用的框架是4.5,如果這有什麼不同。 – Ryan

+0

有趣的,特別是在埃利安的帖子下面。不知道我做了什麼不同(雖然我使用4.0框架...) – Joe

回答

9

我只是看着成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; 

* )實現比這更復雜,因爲它也有存在多個應用程序域的情況下交易和其他特殊情況。我簡化了最常見情況的代碼。

+0

有趣的問題..無論如何,我轉換到Assembly.Location,它已解決。謝謝 :) – Ryan

1

奇怪的錯誤/錯誤。除了使用替換函數或擴展方法始終返回正確的格式,您可以嘗試使用

System.Reflection.Assembly.GetExecutingAssembly().Location 

而不是ExecutablePath。