我正在尝试在 Widows Mobile 上使用 C#/.NET Compact Framework 以编程方式确定存储卡的集群大小。对于桌面 Windows,有 GetDiskFreeSpace() 函数,但在 coredll.dll/Windows Mobile 中不存在。
有没有其他方法可以找出存储卡集群的大小?
我正在尝试在 Widows Mobile 上使用 C#/.NET Compact Framework 以编程方式确定存储卡的集群大小。对于桌面 Windows,有 GetDiskFreeSpace() 函数,但在 coredll.dll/Windows Mobile 中不存在。
有没有其他方法可以找出存储卡集群的大小?
我自己没有尝试过,但是您可以尝试CeGetVolumeInfo并检查 dwBlockSize 值。这看起来可能是集群大小。
如果这不起作用,那么它会涉及更多。
存储卡通常以FAT 格式格式化。
您需要访问 CE 中的低级例程以在磁盘级别读取并读取 FAT BPB,它确定 FAT 的类型和簇大小。
使用存储管理器功能FindFirstStore / FindNextStore 来查找您想要的存储卡。然后使用 CreateFile API 打开存储卡。
HANDLE hDisk(CreateFile(storeInfo.szDeviceName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL));
然后您需要读取超级磁盘第一个扇区上的 FAT BPB(对于存储卡格式的设备来说这是正常情况),或者它是 MBR 格式。
SG_REQ req;
DWORD cb;
req.sr_start = 0;
req.sr_num_sec = 1;
req.sr_num_sg = 1;
req.sr_status = 0;
req.sr_callback = 0;
req.sr_sglist[0].sb_buf = sectorBuffer;
req.sr_sglist[0].sb_len = storeInfo.dwBytesPerSector;
DeviceIoControl(hDisk, DISK_IOCTL_READ, &req, sizeof(req), 0, 0, &cb, 0);
获得 BPB 后,您需要确定它是什么胖格式(FAT12/FAT16/FAT32),然后从中提取簇大小。
如何在 C# 中执行上述操作取决于您。我在存储管理器参考中看到它可以下降到分区级别,您可以查询分区类型。这将告诉您 FAT 类型,因此您无需弄清楚。
该论坛帖子给出了其他人遇到此问题的一些想法。