deviceiocontrol和磁盘大小问题

时间:2009-12-17 07:17:37

标签: c# pinvoke

我正在使用C#和pinvoke读取/写入原始SD卡。我需要通过deviceiocontrol获得总容量:

[StructLayout(LayoutKind.Sequential)]
public struct DISK_GEOMETRY
{
public long Cylinders;
public int MediaType;
public int TracksPerCylinder;
public int SectorsPerTrack;
public int BytesPerSector;
public long DiskSize
{
get
{
return Cylinders * (long)TracksPerCylinder * (long)SectorsPerTrack * (long)BytesPerSector;
}
}
}

...

uint dummy;
DISK_GEOMETRY diskGeo = new DISK_GEOMETRY();
DeviceIoControl(safeHandle, EIOControlCode.DiskGetDriveGeometry, IntPtr.Zero, 0,
                    ref diskGeo, (uint)Marshal.SizeOf(typeof(DISK_GEOMETRY)), out dummy, IntPtr.Zero);                
this.sectorSize = diskGeo.BytesPerSector;
this.bufferSize = this.sectorSize * 16384;
this.diskSize = diskGeo.DiskSize;

使用1 GiB的SD卡,diskGeo.DiskSize为1011709440.为什么?

1 个答案:

答案 0 :(得分:1)

那是约。 965MB这是可用分区的实际大小。丢失的59MB是一个开销分区,其中包含SD版权保护机制等内容。根据文件格式(FAT16,FAT32等),文件分配表等也可能丢失空间