Как правильно определить размер диска - PullRequest
3 голосов
/ 24 октября 2010

Я пытаюсь определить размер физического устройства подключенного USB-накопителя.Я пытался использовать WMI.

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

Я пытался использовать импорт, чтобы получить геометрию:

        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;

Они все возвращают значение .. но это не правильно.

Например, приведенный выше код возвращает 250056737280. Когда я выгружаю все двоичное содержимое в новый файл, FileStream.Length возвращает 250059350015

Видите, как больше последний параметр?Это также правильный размер, который мне нужно получить, чтобы мой код работал должным образом.Но я не могу сбросить 250 ГБ данных, чтобы получить полный размер.Так есть ли другой способ получить правильный размер?

Ответы [ 2 ]

1 голос
/ 24 октября 2010

Вы можете попробовать IOCTL_DISK_GET_LENGTH_INFO с DevideIoControl.

0 голосов
/ 24 октября 2010

Вам это пригодится?

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);
        }
    }
}

Найденный выше пример здесь: http://www.java2s.com/Tutorial/CSharp/0520__Windows/Getfreediskspace.htm

Приветствия. Иак.

...