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 函数实现来获取。