001 获取驱动器的卷标
调用API函数中GetVolumeInformation来获取驱动器的卷标。备注:该函数可以获取磁盘序列号和文件系统信息。
BOOL GetVolumeInformation(LPCTSTR lpRootPathName, //根目录的名称
LPTSTR lpVolumeNameBuffer, //存放卷标名称的缓存
DWORD nVolumeNameSize, //卷标名称的大小
LPDWORD lpVolumeSerialNumber, //卷标的序列号
LPDWORD lpMaximumComponentLength, //最大文件名长度
LPDWORD lpFileSystemFlags, //文件系统标志
LPTSTR lpFileSystemNameBuffer, //存放文件系统名称的缓存
DWORD nFileSystemNameSize //存放文件系统名称的缓存的大小
);
操作流程(vs2010):
首先新建MFC工程,添加列表视图控件(list control )和按钮控件(button),右击项目-属性-配置属性-常规-将字符这项改为“使用多字符字符集”-应用-确认。选中窗体中list control控件-右击-属性-View改为“Report”。选中窗体中list control控件再次右击-添加变量- m_linkList,点击button按钮进入编写, 代码如下:
DWORD size;
size = ::GetLogicalDriveStrings(0, NULL); //获取一个字串,其中包含了当前所有逻辑驱动器的根驱动器路径
if (size != 0)
{
HANDLE heap = ::GetProcessHeap(); //是一个Windows API函数。它返回调用进程的默认堆句柄
LPSTR lp = (LPSTR)HeapAlloc(heap, HEAP_ZERO_MEMORY, size*sizeof(TCHAR)); //是一个Windows API函数。它用来在指定的堆上分配内存,并且分配后的内存不可移动
::GetLogicalDriveStringsA(size*sizeof(TCHAR), lp);
while(*lp != 0)
{
UINT res = ::GetDriveTypeA(lp);
if (res = DRIVE_FIXED) //=作用是将光驱盘强制设置为DRIVE_FIXED
{
m_linkList.InsertItem(0, lp, 0);
lp = _tcschr(lp, 0) + 1; //截取并返回str中字符c出现的最后一个位置开始的字符串的指针,如果没有发现返回NULL。
}
}
}
LPTSTR namebuf = new char[12]; //GetVolumeInformation函数参数定义
DWORD namesize = 12;
DWORD seralnumber;
DWORD maxlen;
DWORD fileflag;
LPTSTR sysnamebuf = new char[10];
DWORD sysnamesize = 10;
int num = m_linkList.GetItemCount();
for (int i = 0; i < num; i++)
{
CString str, temp;
str = m_linkList.GetItemText(i,0);
::GetVolumeInformation(str, namebuf, namesize, &seralnumber,&maxlen, &fileflag, sysnamebuf, sysnamesize);
temp.Format("%s", namebuf);
m_linkList.SetItemText(i, 1, temp);
}
m_linkList.InsertColumn(1, "卷标", LVCFMT_CENTER, 140, 50);