2011-03-16 37 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;