We generally map network paths as local drives for ease of access and without having to manually go to the shared location. At times, there is a need to resolve the external network path that has been locally mapped to your machine.
Say you have a shared folder across the network that reads something like \\S734410-W10\shared\tools.
This is mapped to the drive Y:\ on your local workstation. Assume there is a folder named “software” in the mapped location. Ideally, it would read as \S734410-W10\shared\tools\software.
However, when you try to access it via some C# code you would always end up getting Y:\software which wouldn’t be understood if the path is being saved universally across systems, maybe in a database.
There is a need to get the UNC ( Universal Naming Convention ) path from the mapped path and there is no direct code in managed C# that you could find to get this done. The Windows function – WnetGetConnection(…) can be used here to transform the mapped path to UNC path.
public static extern int WNetGetConnection( [MarshalAs(UnmanagedType.LPTStr)] string localName, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder remoteName, ref int length);
The above code block shows the WnetGetConnection(…) function signature.
First parameter localName stands for the mapped path and the second parameter remoteName is a StringBuilder object which gets populated with the resolved path that is represented by the mapped path driver letter ( “Y” in our case ). The third parameter length specified the capacity of the SringBuilder object.
So the method call would be something like this :
int error = WNetGetConnection("Y", sb, 512); //Y is the mapped drive letter //sb is the StringBuilder object that will be returned with the resolved path. //512 is the specified capacity of the StringBuilder object.
Thanks for this article, it was a good starting point.
Unfortunately you forgot to add the [DllImport] line, which needs to explicitly specify CharSet.Ansi to select the WNetGetConnectionA method that matches the data types in your method signature.
After some trouble shooting I found a working solution:
[DllImport(“mpr.dll”, CharSet=CharSet.Auto)]
public static extern int WNetGetConnection(string localName, StringBuilder remoteName, ref int length);
Thanks and glad it helped. I will add the DLLImport clause. I think it fell through the cracks.
Thank you! You’ve just saved me from a mental breakdown 🙂 !