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 に答える