I have a txt file with volume id's in it.
I need to get drive info (drive letter, drive size, etc.) from the drive volume id (Windows):
the volume id is in the following format:
\\?\Volume{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
The drive can be Removable/local disk
It doesn't matter how the info is retrieved (it could be script, cpp ,c#, java code).
EDIT:
I tried to use DriveInfo, Win32_LogicalDisk, Win32_Volume, Win32_PnpDevices - but I couldn't find this weird id... in all cases the id has a differrent format
UPDATE:
Found out how to do it.
you can enumerate Win32_Volume like this:
ManagementObjectSearcher ms = new ManagementObjectSearcher("Select * from Win32_Volume");
foreach(ManagementObject mo in ms.Get())
{
var guid = mo["DeviceID"].ToString();
if(guid == myGuid)
return mo["DriveLetter"];
}
Volume size, etcetera is easy. Just use the normal Win32 methods. Any function that accepts "C:"
as a drive will also accept the volume GUID path (because that's what a \\?\Volume{XXX}
is properly called).
The "drive letter" is a bit trickier as there may be 0, 1 or more drive letters. You need to call FindFirstVolumeMountPoint / FindNextVolumeMountPoint / FindVolumeMountPointClose
to get all of them.
Try use this
System.Management.ManagementObjectSearcher ms =
new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
foreach (ManagementObject mo in ms.Get())
{
//Find by ID
}
For details reed this Win32_DiskDrive class
There is an API function for this:
GetVolumePathNamesForVolumeName
It returns a null terminated array, to allow for multiple mount points. If you have only one mount point (typical), then you can read it as a regular null terminated string.
This is more efficient that enumerating disks/volumes, which could cause idle disks to spin up.
You can use DriveInfo.GetDrives Method
to get drive info. Here is the sample code from MSDN
DriveInfo[] allDrives = DriveInfo.GetDrives();
foreach (DriveInfo d in allDrives)
{
Console.WriteLine("Drive {0}", d.Name);
Console.WriteLine(" File type: {0}", d.DriveType);
if (d.IsReady == true)
{
Console.WriteLine(" Volume label: {0}", d.VolumeLabel);
Console.WriteLine(" File system: {0}", d.DriveFormat);
Console.WriteLine(
" Available space to current user:{0, 15} bytes",
d.AvailableFreeSpace);
Console.WriteLine(
" Total available space: {0, 15} bytes",
d.TotalFreeSpace);
Console.WriteLine(
" Total size of drive: {0, 15} bytes ",
d.TotalSize);
}
}