首页 > 解决方案 > 从文件路径返回网络名称

问题描述

我遇到了一个问题,当用户将文件目录添加到我的项目时,链接将存储为他们自己的映射驱动器。例如;

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;
    }
}

无论如何我可以用我目前拥有的东西来实现这一目标吗?

标签: c#wpf

解决方案


感谢@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;
    }
}

推荐阅读