First, we need something to store the info in:
Code:
public class NetworkFolder
{
private string _drive;
private string _unc;
public string Drive
{
get { return _drive; }
}
public string Unc
{
get { return _unc; }
}
public NetworkFolder(string drive, string unc)
{
_drive = drive;
_unc = unc;
}
}
Then using results from here, particularly http://www.thescripts.com/forum/thread248531.html
Code:
public class LogicalDriveHelper
{
[DllImport("mpr.dll")]
private static extern int WNetGetUniversalName(string lpLocalPath, int dwInfoLevel, ref UNIVERSAL_NAME_INFO lpBuffer, ref int lpBufferSize);
[DllImport("mpr", CharSet = CharSet.Auto)]
protected static extern int WNetGetUniversalName(string lpLocalPath, int dwInfoLevel, IntPtr lpBuffer, ref int lpBufferSize);
[DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint GetDriveType(string lpRootPathName);
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
private struct UNIVERSAL_NAME_INFO
{
[MarshalAs(UnmanagedType.LPTStr)]
public string lpUniversalName;
}
private const int NO_ERROR = 0;
private const int ERROR_MORE_DATA = 234;
private const int ERROR_NOT_CONNECTED = 2250;
private const int UNIVERSAL_NAME_INFO_LEVEL = 1;
private const uint DRIVE_UNKNOWN = 0; // Unknown drive type
private const uint DRIVE_NO_ROOT_DIR = 1; // Invalid root path was given to the function
private const uint DRIVE_REMOVABLE = 2; // Removeable drive like a floppy
private const uint DRIVE_FIXED = 3; // Fixed drive like a hard disk
private const uint DRIVE_REMOTE = 4; // Network drive
private const uint DRIVE_CDROM = 5; // CD-ROM drive
private const uint DRIVE_RAMDISK = 6; // RAM disk
public static NetworkFolder[] List()
{
string[] logicalDrives = Environment.GetLogicalDrives();
List<NetworkFolder> networkFolders = new List<NetworkFolder>(logicalDrives.Length);
foreach (string logicalDrive in logicalDrives)
{
if (IsNetworkDrive(logicalDrive))
{
string uncPath = GetUncPath(logicalDrive);
networkFolders.Add(new NetworkFolder(logicalDrive, uncPath));
}
}
networkFolders.TrimExcess();
return networkFolders.ToArray();
}
private static bool IsNetworkDrive(string drive)
{
uint type = GetDriveType(drive);
return (type == DRIVE_REMOTE);
}
private static string GetUncPath(string mappedDrive)
{
UNIVERSAL_NAME_INFO nameInfo = new UNIVERSAL_NAME_INFO();
int bufferSize = Marshal.SizeOf(nameInfo);
int getUncNameResult = WNetGetUniversalName(mappedDrive, UNIVERSAL_NAME_INFO_LEVEL, ref nameInfo, ref bufferSize);
if (getUncNameResult == ERROR_MORE_DATA)
{
IntPtr pBuffer = Marshal.AllocHGlobal(bufferSize);
try
{
getUncNameResult = WNetGetUniversalName(mappedDrive, UNIVERSAL_NAME_INFO_LEVEL, pBuffer, ref bufferSize);
if (getUncNameResult == NO_ERROR)
nameInfo = (UNIVERSAL_NAME_INFO) Marshal.PtrToStructure(pBuffer, typeof(UNIVERSAL_NAME_INFO));
}
finally
{
Marshal.FreeHGlobal(pBuffer);
}
}
if (getUncNameResult == NO_ERROR)
return nameInfo.lpUniversalName;
return string.Empty;
}
}
Usage:
Code:
NetworkFolder[] networkFolders = LogicalDriveHelper.List();
foreach (NetworkFolder folder in networkFolders)
{
Console.WriteLine("{0}\t{1}", folder.Drive, folder.Unc);
}