4

我正在尝试在 Widows Mobile 上使用 C#/.NET Compact Framework 以编程方式确定存储卡的集群大小。对于桌面 Windows,有 GetDiskFreeSpace() 函数,但在 coredll.dll/Windows Mobile 中不存在。

有没有其他方法可以找出存储卡集群的大小?

4

2 回答 2

2

我自己没有尝试过,但是您可以尝试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 类型,因此您无需弄清楚。

于 2009-05-20T22:15:49.497 回答
1

论坛帖子给出了其他人遇到此问题的一些想法。

于 2009-05-20T21:43:21.780 回答