2011-03-16 45 views
2

當我做獲取不-URI位置

string s = Path.Combine(Folders.Data, fileName); 

我有file:\\...(URI中的位置)。我怎樣才能得到c:\...非URI-位置)?

編輯:

的文件夾類的代碼是:

public static class Folders 
{ 
    public static string App 
    { 
     get 
     { 
      return Path.GetDirectoryName(
       Assembly.GetAssembly(typeof(Folders)).CodeBase 
       ); 
     } 
    } 

    public static string Data 
    { 
     get 
     { 
      return Path.Combine(App, "Data"); 
     } 
    } 
} 
+2

什麼是'Folders'?似乎'Folders.Data'已經包含'file://','Path.Combine'只是添加最後一個組件。 – Vlad 2011-03-16 19:45:51

+1

在這種情況下,「文件夾」是什麼? – 2011-03-16 19:46:12

+1

'var x = return y'?這對我來說是新的。 – 2011-03-16 19:49:31

回答

2

Path.Combine添加的最後一個組件,您需要刪除文件:從Folders.Data

\你可以這樣做

string s = Path.Combine(Folders.Data.Replace("file:\\",""), fileName); 

對於清晰的解決方案嘗試使用Assembly.Location,如圖所示here這是你想要的。


因此,而不是使用:

return Path.GetDirectoryName(
       Assembly.GetAssembly(typeof(Folders)).CodeBase 
       ); 

用途:

return Path.GetDirectoryName(
       Assembly.GetAssembly(typeof(Folders)).Location 
       ); 
+0

嗯,它可以這樣做,但我期待爲更清潔的解決方案(如果可能的話)。 – 2011-03-16 19:53:01

+0

嘗試編輯後;) – 2011-03-16 19:57:24

+0

它的工作原理,謝謝ArsenMkrt – 2011-03-16 20:05:26

2

使用Location屬性,而不是獲取位置:

var path = Assembly.GetAssembly(typeof(Folders)).Location; 

編輯:

Location財產from MSDN的幾個注意事項:

獲取包含 清單中的 加載文件的路徑或UNC位置。


[返回] 包含清單的加載文件的位置。如果加載的 文件被陰影複製,則 的位置是 被陰影複製後的文件的位置。如果程序集是從字節數組加載的 ,例如 使用Load(Byte [])方法 過載,則返回的值爲 空字符串(「」)。


要將文件 之前得到的位置一直影像複製,使用 codebase屬性。


[能提高] NotSupportedException異常 當前組件是一個動態的組件, 由AssemblyBuilder 對象表示。

+0

它的工作原理,謝謝先生失望 – 2011-03-16 20:06:29

+1

沒問題;不過,我將編輯,因爲'Location'將始終返回一個目錄名稱,因爲您甚至不需要'Path.GetDirectoryName'。 – 2011-03-16 20:08:31

2

如果你有一個file:// URI,你可以將其轉換爲這樣的正常路徑:

var fileUri = Folders.Data; 
var asPath = new Uri(fileUri).LocalPath;