2012-04-17 14 views
5

Mam plik txt z identyfikatorami woluminu w nim.Jak uzyskać informacje o dysku według woluminu id

Muszę jechać info (litera dysku, rozmiar dysku, itp) z identyfikatorem głośności napędu (Windows):

id objętość jest w następującym formacie:

\\?\Volume{XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} 

The dysk może być Dysk wymienny/lokalny

Nie ma znaczenia, w jaki sposób informacje są pobierane (może to być skrypt, cpp, C#, kod Java).

EDIT:

Próbowałem użyć DriveInfo, Win32_LogicalDisk, Win32_Volume, Win32_PnpDevices - ale nie mogłem znaleźć tego dziwnego id ... we wszystkich przypadkach id ma differrent formatu

AKTUALIZACJA:

Dowiedz się, jak to zrobić.

można wyliczyć Win32_Volume tak:

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"]; 
} 
+0

Skąd wziął się ten identyfikator w pliku txt. Odwrócić inżynier, aby osiągnąć wyniki. –

+0

Próbuję śledzić, gdzie "File History" (nowa funkcja w Windows 8) zapisuje pliki kopii zapasowej. Zauważyłem, że docelowa nazwa urządzenia jest zapisana w pliku xml, a także zapisuje literę i nazwę dysku, ale to nie wystarczy, ponieważ te parametry nie są unikalne i można je zmienić: somene może wysunąć urządzenie, a następnie następnym razem będzie mieć przypisaną inną literę, itd., więc znalazłem, że program microsoft zapisuje także coś, co wygląda następująco: " \\? \ Volume {XXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} <\ TargetVolumePath> "który jest unikalnym identyfikatorem. – user844541

Odpowiedz

2

Wielkość woluminu itp. Jest prosta. Po prostu użyj zwykłych metod Win32. Dowolna funkcja, która akceptuje "C:" jako napęd, będzie również akceptować ścieżkę woluminu GUID woluminu (ponieważ tak właśnie nazywa się \\?\Volume{XXX}).

"Litera dysku" jest nieco trudniejsza, ponieważ może istnieć 0, 1 lub więcej liter dysków. Aby uzyskać wszystkie z nich, musisz zadzwonić pod numer FindFirstVolumeMountPoint/FindNextVolumeMountPoint/FindVolumeMountPointClose.

+0

Czy możesz dodać przykład kodu za pomocą usługi WMI? Użyłem GetVolumeNameForVolumeMountPoint i to działa, ale nie mogłem sprawić, żeby działało przy użyciu wmi. – user844541

+0

Zobacz przykład na stronie http://msdn.microsoft.com/en-us/library/windows/desktop/aa394515(v=vs.85).aspx – MSalters

2

próbie użycia tego

System.Management.ManagementObjectSearcher ms = 
new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive"); 
foreach (ManagementObject mo in ms.Get()) 
{ 
    //Find by ID 
} 

uzyskać szczegółowe trzciną to Win32_DiskDrive class

-2

Można użyć DriveInfo.GetDrives Method dostać Drive Info. Oto przykładowy kod z 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); 
    } 
} 
+0

Podczas gdy ten kod zawiera listę dysków aktualnie zainstalowanych na komputerze, niestety nie odpowiada na pytanie (tj. Jak uzyskać dostęp do dysków przez GUID), nie ma właściwości w "DriveInfo", która odnosi się do identyfikatora GUID dysku. – jrh

1

Jest to funkcja API: GetVolumePathNamesForVolumeName

Zwraca NUL tablicę, aby umożliwić wielokrotne punkty montowania. Jeśli masz tylko jeden punkt podłączenia (typowy), możesz go odczytać jako zwykły łańcuch zakończony znakiem NUL.

Jest to bardziej wydajne niż wyliczanie dysków/woluminów, które mogą powodować rozruch dysków bezczynnych.

Powiązane problemy