Converting a mapped drive letter to a network path using C#

January 14, 2015 ยท View on GitHub

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; using System.IO;

namespace WiredPrairie.Samples { public static class Pathing { [DllImport("mpr.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int WNetGetConnection( [MarshalAs(UnmanagedType.LPTStr)] string localName, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName, ref int length); ///

/// Given a path, returns the UNC path or the original. (No exceptions /// are raised by this function directly). For example, "P:\2008-02-29" /// might return: "\networkserver\Shares\Photos\2008-02-09" /// /// The path to convert to a UNC Path /// A UNC path. If a network drive letter is specified, the /// drive letter is converted to a UNC or network path. If the /// originalPath cannot be converted, it is returned unchanged. public static string GetUNCPath(string originalPath) { StringBuilder sb = new StringBuilder(512); int size = sb.Capacity;

        // look for the {LETTER}: combination ...
        if (originalPath.Length > 2 && originalPath[1] == ':')
        {
            // don't use char.IsLetter here - as that can be misleading
            // the only valid drive letters are a-z && A-Z.
            char c = originalPath[0];
            if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
            {
                int error = WNetGetConnection(originalPath.Substring(0, 2), 
                    sb, ref size);
                if (error == 0)
                {                        
                    DirectoryInfo dir = new DirectoryInfo(originalPath);

                    string path = Path.GetFullPath(originalPath)
                        .Substring(Path.GetPathRoot(originalPath).Length);
                    return Path.Combine(sb.ToString().TrimEnd(), path);
                }
            }
        }
        
        return originalPath;
    }
}

}