c# - 从文件路径返回网络名称
问题描述
我遇到了一个问题,当用户将文件目录添加到我的项目时,链接将存储为他们自己的映射驱动器。例如;
C:\Location\Location
但是,某些用户可能会将服务器上的 C: 驱动器映射为 M:。因此无法找到该文件。
我想做的是用实际的服务器名称替换它,即
\\ArtServer\
我知道我可以通过替换字符串的开头部分来实现这一点,但是如果将来添加更多服务器,那么这显然会陷入混乱。目前,用户使用标准的获取文件对话框获取文件路径;
public static string GetFilePath(string filter = "All Files (*.*)|*.*", string initialDirectory = @"This PC")
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Filter = filter;
fileDialog.FilterIndex = 1;
fileDialog.Multiselect = false;
fileDialog.InitialDirectory = Directory.Exists(initialDirectory) ? initialDirectory : @"This PC";
if (fileDialog.ShowDialog() == true)
{
return fileDialog.FileName;
}
else
{
return null;
}
}
无论如何我可以用我目前拥有的东西来实现这一目标吗?
解决方案
感谢@ADyson 提供的所有帮助。我决定使用上面链接的线程中 ibram 提供的答案。对于其他有同样问题的人,我已经发布了我所做的;
public static string GetUNCPath(string path)
{
if (path.StartsWith(@"\\"))
{
return path;
}
ManagementObject mo = new ManagementObject();
mo.Path = new ManagementPath(String.Format("Win32_LogicalDisk='{0}'", path));
// DriveType 4 = Network Drive
if (Convert.ToUInt32(mo["DriveType"]) == 4)
{
return Convert.ToString(mo["ProviderName"]);
}
else
{
return path;
}
}
public static string GetFilePath(string filter = "All Files (*.*)|*.*", string initialDirectory = @"This PC")
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Filter = filter;
fileDialog.FilterIndex = 1;
fileDialog.Multiselect = false;
fileDialog.InitialDirectory = Directory.Exists(initialDirectory) ? initialDirectory : @"This PC";
if (fileDialog.ShowDialog() == true)
{
// Split the file directory to gain root path
// Use GetUNCPath to convert root path to server name
string s = fileDialog.FileName;
int index = s.IndexOf(':') + 1;
string rootPath = GetUNCPath(s.Substring(0, index));
string directory = s.Substring(index);
return rootPath + directory;
}
else
{
return null;
}
}
推荐阅读
- function - 为什么 Rust 编译器不够聪明,无法检测同名的变量和函数?
- angular - 在 Angular 中的条件下显示选择选项
- python - 在时间列上进行分组并仅总结唯一值
- azure - AZURE FHIR:_lastUpdated 如何转换为 ResourceSurrogateId
- c# - 如果它们之间存在依赖关系,MsBuild 是否会等到另一个由不同线程启动的 MsBuild 进程完成?
- android - 如何在 Fragment 对象中控制 ViewPager 更改页面
- c++ - 如何降低生产者获取锁而消费者在使用 std::condition_variable 时无法获取锁的可能性?
- c# - 将值设置为列表中的随机属性
- java - 迭代字段列表时不显示jxls
- python - python irc bot试图使用两个不同的消息系统