参考下面代码
void GetStorageInfo()
{
DISK_INFO m_devinfo;
BOOL buf=1;
unsigned long BytesReturned;
//这里DSK1:的名字要根据具体你的块设备index来的,sd卡的index一般不定死,但你可以用注册表工具从Active下面找到被加载的所有block设备,你可以知道哪个DSK是哪个存储设备。5楼更新了具体的方法。
HANDLE h_nfd = CreateFile( L"DSK1:",
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if(h_nfd==NULL)
::MessageBox ( NULL, L"ERRO in createfile", L"ERROR", 0);
if ( FALSE == DeviceIoControl(
h_nfd,
IOCTL_DISK_GETINFO,
NULL,
0,
&m_devinfo
sizeof(m_devinfo),
&BytesReturned,
NULL
)) {
::MessageBox ( NULL, L"DISK_IOCTL_GETINFO", L"ERROR", 0);
return ;
}
CString tmp;
tmp.Format(L"di_bytes_per_sect=%d di_total_sectors =%d Total Captal=%d\r\n",inbuf.di_bytes_per_sect,inbuf.di_total_sectors,di_total_sectors*di_bytes_per_sect );
::MessageBox ( NULL, tmp, L"ERROR", 0);
CloseHandle(h_nfd);
}
======================================
补充:
#include "winioctl.h"
#include "Diskio.h"
m_devinfo里面就会有sector总数和sector大小,进而算出总容量,这个是基于文件系统层的获得容量,并非实际物理容量
其中的DSK1:需要被替换成你的SD存储设备被加载的号码,一般为DSK2:
也可以通过枚举HKEY_LOCAL_MACHINE\Drivers\Active下的键值,来获得SD的DSK号码,比如
[HKEY_LOCAL_MACHINE\Drivers\Active\49]
"Hnd"=dword:005adc00
"Name"="DSK2:"
"Key"="\Drivers\\SDCARD\\ClientDrivers\\Class\\SDMemory_Class"
"BusParent"=dword:0059a2a0
"InterfaceType"=dword:00000000
"BusName"="SDCARD_0_0_0"
"ClientInfo"=dword:005a5080
这里的DSK2:就是你要传递的参数了
本文来自eeworld博客,转载请标明出处:http://blog.eeworld.net/lan120576664/archive/2009/09/21/4576760.aspx