2016-05-04 8 views
1

Я хочу иметь возможность программно получить размер физического диска или логические диски, которые являются частью физического диска.Получить размер диска и/или диск с неизвестным файловым форматом, C# .NET Framework?

В нормальных условиях получение логического размера диска очень просто. Но для диска, который я использую, я намеренно написал для него необработанные данные, и, следовательно, ожидается, что нет известного формата диска.

Из-за того, что формат диска неизвестен Windows, свойства диска Windows и DriveInfo .NET Framework не могут определить размер логического диска (дисков), составляющих этот физический диск. В DriveInfo foo по формату я имею в виду foo.DriveFormat, foo.IsReady - false, а foo.TotalSize вызывает исключение. Просто щелкнув диск и получив размер вручную через параметр свойств Windows, он отображает 0 байтов для размера диска.

Рекомендуется использовать C# с использованием .NET Framework 4.0 или более ранней версии в системе Windows 7, как узнать размер физического диска или логические диски, составляющие физический диск, если логические диски, связанные с у него нет известной файловой структуры? В частности, размер физического диска предпочтительнее для моих целей.

Я знаю, что есть общий способ использования Windows 7, так как я видел, что приложения дают точный размер физического диска того же диска.

+2

Вы видели этот вопрос? http://stackoverflow.com/questions/4008620/getting-disk-size-properly –

+0

Возможны ли сообщения управления IO? IOCTL_DISK_GET_LENGTH_INFO/IOCTL_DISK_GET_DRIVE_GEOMETRY –

+0

@ LasseV.Karlsen, я нашел вопрос до и. После некоторых дальнейших усилий я обнаружил, что я не использовал IOCTL_DISK_GET_LENGTH_INFO в .NET Framework должным образом (использование маркером указателей и структур было неправильным). Я соответствующим образом обновлю ответ. –

ответ

1

решение в конечном итоге быть довольно простым, и расширение от существующего вопроса Getting Disk Size Properly

Проводка мое решение здесь, как, возможно, полный код поможет кому-то в будущем:
(FYI: P/определения Invoke полученных и минимально модифицированных от http://pinvoke.net)

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
public static extern IntPtr CreateFile(
    [MarshalAs(UnmanagedType.LPTStr)] string filename, 
    [MarshalAs(UnmanagedType.U4)] FileAccess access, 
    [MarshalAs(UnmanagedType.U4)] FileShare share, 
    IntPtr securityAttributes, // optional SECURITY_ATTRIBUTES struct or IntPtr.Zero 
    [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition, 
    [MarshalAs(UnmanagedType.U4)] FileAttributes flagsAndAttributes, 
    IntPtr templateFile); 

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)] 
static extern bool DeviceIoControl(IntPtr hDevice, uint dwIoControlCode, 
    IntPtr lpInBuffer, uint nInBufferSize, 
    IntPtr lpOutBuffer, uint nOutBufferSize, 
    out uint lpBytesReturned, IntPtr lpOverlapped); 

[DllImport("kernel32.dll", SetLastError = true)] 
static extern bool CloseHandle(IntPtr hObject); 

struct GET_LENGTH_INFORMATION 
{ 
    public long Length; 
}; 
long GetPhysDiskSize(string physDeviceID) 
{ 
    uint IOCTL_DISK_GET_LENGTH_INFO = 0x0007405C; 
    uint dwBytesReturned; 

    //Example, physDeviceID == @"\\.\PHYSICALDRIVE1" 
    IntPtr hVolume = CreateFile(physDeviceID, FileAccess.ReadWrite, 
     FileShare.None, IntPtr.Zero, FileMode.Open, FileAttributes.Normal, IntPtr.Zero); 

    GET_LENGTH_INFORMATION outputInfo = new GET_LENGTH_INFORMATION(); 
    outputInfo.Length = 0; 

    IntPtr outBuff = Marshal.AllocHGlobal(Marshal.SizeOf(outputInfo)); 

    bool devIOPass = DeviceIoControl(hVolume, 
         IOCTL_DISK_GET_LENGTH_INFO, 
         IntPtr.Zero, 0, 
         outBuff, (uint)Marshal.SizeOf(outputInfo), 
         out dwBytesReturned, 
         IntPtr.Zero); 

    CloseHandle(hVolume); 

    outputInfo = (GET_LENGTH_INFORMATION)Marshal.PtrToStructure(outBuff, typeof(GET_LENGTH_INFORMATION)); 

    Marshal.FreeHGlobal(hVolume); 
    Marshal.FreeHGlobal(outBuff); 

    return outputInfo.Length; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^