.NET Compact Framework中的群集大小

4

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

是否有其他方法可以查找存储卡的群集大小?

2个回答

2
我自己没有尝试过,但您可以尝试使用CeGetVolumeInfo并检查dwBlockSize值。这看起来可能是簇大小。
如果这不起作用,那就需要更深入的了解。
存储卡通常以FAT格式格式化。
您需要访问CE中的低级例程,以在磁盘级别读取并读取FAT BPB以确定FAT类型和簇大小。
使用Storage Manager函数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#中完成上述操作由您决定。我在存储管理器参考资料中看到它可以下降到分区级别,并且您可以查询分区类型。这将告诉您文件系统的类型,因此您无需自己计算。

1

这个论坛帖子提供了一些关于其他人遇到同样问题的想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接