分享

获取WINCE和WINXP的外部存储器

 lhzstudio 2012-05-15
WINCEWINXP文件夹分为对象存储和外部存储.对象存储处于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来判断其返回值。我们应该改用FindFirstFileFindNextFile来查找。

实现代码如下:

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约