2009-12-17 59 views
1

我正在使用C#和pinvoke来读取/写入原始SD卡。我需要得到具有DeviceIoControl的总容量: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吉布的SD卡,该diskGeo.DiskSize是1011709440.为什么?

回答

1

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

+0

非常感谢,这是我正在寻找的答案。我需要使用pinvoke擦除分区中的信息。最后一点:使用hexplorer,我可以读取/写入1073741824字节,整个1 GiB。 – ric 2009-12-18 06:12:39