2010-10-24 34 views
3

J'essaie d'obtenir la taille du périphérique physique d'une clé USB connectée. J'ai essayé d'utiliser WMI.Obtenir correctement la taille du disque

 ManagementObjectSearcher mosDisks = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive WHERE Model = '" + cmbHdd.SelectedItem + "'"); 
     foreach (ManagementObject moDisk in mosDisks.Get()) 
     { 
      lblCapacity.Text = "Capacity: " + moDisk["Size"]; 
     } 

J'ai essayé d'utiliser les importations pour obtenir la géométrie:

 var geo = new DiskGeometry(); 
     uint returnedBytes; 
     DeviceIoControl(Handle, 0x70000, IntPtr.Zero, 0, ref geo, (uint)Marshal.SizeOf(typeof(DiskGeometry)), out returnedBytes, IntPtr.Zero); 
     return geo.DiskSize; 

Ils font tous retourner une valeur .. mais ce n'est pas correct.

Par exemple, le code ci-dessus renvoie 250056737280. Lorsque je vide l'intégralité du contenu binaire dans un nouveau fichier, FileStream.Length retourne 250059350015

Voyez comment la dernière option est plus grand? C'est aussi la taille corrrect que j'ai besoin pour que mon code fonctionne comme prévu. Mais je ne peux pas sauvegarder 250 Go de données juste pour obtenir la taille réelle. Y a-t-il une autre méthode pour obtenir la bonne taille?

Répondre

1

Vous pouvez essayer IOCTL_DISK_GET_LENGTH_INFO avec DevideIoControl.

+0

Intéressant. Où puis-je trouver ces énumérations comme entiers pour que je puisse mettre la valeur correcte? – Eaton

+1

Les constantes sont définies dans WinIoCtl.h. La valeur de IOCTL_DISK_GET_LENGTH_INFO est 0x0007405c –

+0

Merci, je vais essayer de le faire bientôt et vous faire part de mes résultats. – Eaton

0

Est-ce une utilisation pour vous?

using System; 
using System.Runtime.InteropServices; 

public class MainClass 
{ 
    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
    static extern bool GetDiskFreeSpaceEx(string lpDirectoryName, 
     out ulong lpFreeBytesAvailable, 
     out ulong lpTotalNumberOfBytes, 
     out ulong lpTotalNumberOfFreeBytes); 
    public static void Main() 
    { 
     ulong freeBytesAvail; 
     ulong totalNumOfBytes; 
     ulong totalNumOfFreeBytes; 

     if (!GetDiskFreeSpaceEx("C:\\", out freeBytesAvail, out totalNumOfBytes, out totalNumOfFreeBytes)) 
     { 
      Console.Error.WriteLine("Error occurred: {0}", 
       Marshal.GetExceptionForHR(Marshal.GetLastWin32Error()).Message); 
     } 
     else 
     { 
      Console.WriteLine("Free disk space:"); 
      Console.WriteLine(" Available bytes : {0}", freeBytesAvail); 
      Console.WriteLine(" Total # of bytes: {0}", totalNumOfBytes); 
      Console.WriteLine(" Total free bytes: {0}", totalNumOfFreeBytes); 
     } 
    } 
} 

trouvé l'exemple ci-dessus ici: http://www.java2s.com/Tutorial/CSharp/0520__Windows/Getfreediskspace.htm

Vive. Jas.

+0

Merci, mais je n'arrive pas à l'ouvrir pour ouvrir mon appareil. http://nvsx.net/i/83679.png Ce chemin a toujours fonctionné pour moi. Et est correct. – Eaton

+0

Merde. Oh bien, ça vaut le coup. Je ne suis pas sûr de ce qui se passe là j'ai peur. –

+0

Tout va bien. Je ne pense pas que ce serait bien, même si cela fonctionnait. Je veux la taille totale, pas la taille libre. Ce périphérique est également non formaté et n'est pas une lettre de lecteur logique. C'est pourquoi j'ai besoin de mettre le chemin physique. – Eaton