当我这样做时
string s = Path.Combine(Folders.Data, fileName);
我有file:\\...
(URI位置)。如何获取c:\...
( not-URI 位置)?
修改
Folders类的代码是:
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");
}
}
}
答案 0 :(得分: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
);
答案 1 :(得分:2)
使用Location
属性获取位置:
var path = Assembly.GetAssembly(typeof(Folders)).Location;
编辑:
关于Location
属性from MSDN的一些注释:
获取的路径或UNC位置 加载的文件包含 清单。
[返回]加载文件的位置 包含清单。如果加载 文件被阴影复制,位置 是之后的文件 影像复制。如果组件是 从字节数组加载,例如何时加载 使用Load(Byte [])方法 重载,返回的值是 空字符串(“”)。
获取文件前的位置 已被影子复制,使用 CodeBase属性。
[可以引发] NotSupportedException 当前组件是动态组件, 由AssemblyBuilder代表 对象
答案 2 :(得分:2)
如果你有一个file://
URI,你可以将它转换为这样的正常路径:
var fileUri = Folders.Data;
var asPath = new Uri(fileUri).LocalPath;