WINCE和WINXP文件夹分为对象存储和外部存储.对象存储处于RAM,断电消失;外部存储即硬盘U盘等非易失性存储器,断电数据依然存在.不过在Windows CE文件系统中没有使用驱动器名,取而代之,文件路径是基于文件系统根目录定义的。不同的存储卷,如硬盘驱动器或是独立的flash文件系统,都表现为文件系统根目录下的不同目录。除此之外,Windows CE 下没有当前目录的存在(即目录名称名称为 ‘.’)。
既然两者处在不同之处,那么在获取外部存储器是会有不同。下面我们来看一下具体的实现。 首先,看一下在WinXp 下如何获取存储器。 在WinXp下存储卷标号是26个英文字母中的一个,这样我们就可以通过调用CreateFile函数将TEXT("////.//A:")到TEXT("////.//Z:")枚举一遍,判断其返回值。如果返回值不为INVALID_HANDLE_VALUE ,再调用GetDriveType函数来返回存储器的类型。 代码实现如下: enum FileDeviceType // The type of disk partition { DISK_FIXED, //本地存储器 DISK_REMOVABLE,//外部存储器 CDROM //光驱存储器 }; //--------------------------------------------------------------------- //Description: // Get disk partition // //Parameters: // mDiskParition: [Out] Store disk partition'type and volume label // //--------------------------------------------------------------------- void GetDiskPartition(std::multimap<FileDeviceType,std::wstring> &mDiskParition) { HANDLE hDevice; std::wstring strBaseDisk = TEXT("////.//");
TCHAR BaseNumber = TEXT('A');
//在WinXp下存储卷标号是26个英文字母中的一个,从‘A’到‘Z’ for(int i = 0; i<26;i++) { std::wstring strDiskNumber; strDiskNumber += (BaseNumber + i); strDiskNumber += TEXT(':');
std::wstring strDiskName = strBaseDisk; strDiskName +=strDiskNumber;
hDevice = CreateFile(strDiskName.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
if(hDevice != INVALID_HANDLE_VALUE) { strDiskNumber += TEXT("//");
if(DRIVE_CDROM == GetDriveType(strDiskNumber.c_str())) { mDiskParition.insert(make_pair(CDROM,strDiskNumber));
}else if(DRIVE_REMOVABLE == GetDriveType(strDiskNumber.c_str())) {
mDiskParition.insert(make_pair(DISK_REMOVABLE,strDiskNumber));
} else if(DRIVE_FIXED == GetDriveType(strDiskNumber.c_str())) {
mDiskParition.insert(make_pair(DISK_FIXED,strDiskNumber));
}
} CloseHandle(hDevice); } }
你要获取外部存储器,可以通过对GetDiskPartition调用调用传入一个mDiskParition参数,之后只有从mDiskParition中取出关键字为DISK_REMOVABLE就行了。
获取WinXp下的外部存储器实现完了,接下来我们看看在Win CE 下的怎么获取外部的存储器。注意在Windows CE文件系统中没有使用驱动器名,因此我们不能通过将TEXT("////.//A:")到TEXT("////.//Z:")作为参数传送给CreateFile来判断其返回值。我们应该改用FindFirstFile和FindNextFile来查找。 实现代码如下: CString m_sStorageName[20]; //外部定义的一个数组,用来保存外部存储器名 void FindStorage( ) { HANDLE hSearch; // FindFirstFile函数返回的句柄 WIN32_FIND_DATA fd; // 文件的数据结构 BOOL bFinished = FALSE; // 循环结束标志 TCHAR *szFname = TEXT("//*"); // 要查找的文件名 m_iStorageNum=0; //外部存储器的数量
// 确认是否有文件存在. hSearch = FindFirstFile(szFname, &fd);
if (hSearch == INVALID_HANDLE_VALUE) { //没找到,返回 return; }
do {
//当文件具有FILE_ATTRIBUTE_TEMPORARY和FILE_ATTRIBUTE_DIRECTORY属性才是外部存储器(文件夹)
if ( (fd.dwFileAttributes & FILE_ATTRIBUTE_TEMPORARY) && (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { m_iStorageNum++; m_sStorageName[m_iStorageNum-1]=fd.cFileName; //存储存储器名 }
if (!FindNextFile (hSearch, &fd)) { //已经查找到最后一个文件,置结束标志 bFinished = TRUE; } } while (!bFinished);
FindClose (hSearch); // 关闭句柄. }
其实在获取WinXp 下的外部也可以用FindFirstFile 和FileNextFile 函数实现来获取。 |
|