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 タイプがわかるので、調べる必要はありません。
このフォーラムの投稿は、この問題を抱えている他の誰かのアイデアを提供します。