随笔-145  评论-173  文章-70  trackbacks-0

1.
VOID CFileIO::GetFolderNamesInDir(CStringArray &StringArray, LPCTSTR lpszExpression)
{
 CFileFind FileFind;
 CString str = lpszExpression;
 str += "\\*.*";
 if(!FileFind.FindFile(str))
  return;
 BOOL bFound;
 do{
  bFound = FileFind.FindNextFile();
  if(FileFind.IsDirectory())
  {
   CString strFileName = FileFind.GetFileName();
   if(strFileName != "." && strFileName != "..")
    StringArray.Add(FileFind.GetFileName());
  }
 }while(bFound);
}
此函数的入口参数是一个CString数组,后面的那个lpszExpression是一个要搜索的文件名,你可以选择通配符,比如是"*.jpg"来搜索下面的所有的文件名。然后此函数会把文件名都存入到那个数组中,因为是用的引用。注意的是,那个lpszExpression需要绝对路径,所以需要的格式是类似这种形式:"d:\\fp\\temp.bmp"。存入的也是名字,而没有路径的。

2.选择路径。
CString CFileIO::SelectDirectory(LPCTSTR lpszTitle)
{
 static TCHAR strDirName[MAX_PATH];

 BROWSEINFO bi;
 bi.hwndOwner = ::GetFocus();
 bi.pidlRoot = NULL;
    bi.pszDisplayName = strDirName;
 bi.lpszTitle = lpszTitle;
    bi.ulFlags = BIF_BROWSEFORCOMPUTER | BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS;
    bi.lpfn = NULL;
 bi.lParam = 0;
 bi.iImage = 0;

 LPITEMIDLIST pItemIDList = ::SHBrowseForFolder(&bi);
 if(pItemIDList == NULL)
 {
  return "";
 }

 ::SHGetPathFromIDList(pItemIDList, strDirName);

 CString str = strDirName;
 if(str != "" && str.Right(1) != '\\')
  str += '\\';

 return str;
}
最终得到的str就是那个路径的名字。上面的函数如果和下面这个配套使用的话,需要注意加如"\",因为需要多一个。这个函数的目的就是为了打开一个文件夹的对话框让你选择。

3.VOID CFileIO::GetFileNamesInDir(CStringArray &StringArray, LPCTSTR lpszExpression)
{
 // The File Name should apply with "d:\\fp\\temp.bmp" Style
 CFileFind FileFind;
 if(!FileFind.FindFile(lpszExpression))
  return;
 BOOL bFound;
 do{
  bFound = FileFind.FindNextFile();
  if(!FileFind.IsDirectory())
   StringArray.Add(FileFind.GetFileName());
 }while(bFound);
}
传入一个路径,得到该路径下面的所有的文件名,还是存入数组,不过没有那些路径名,而只是文件名。还要不会搜索下面的所有的文件夹,只是当前文件夹下面是。
但是,你可以用上面这三个函数做很多事情了。递归调用,完全可以实现之…………

4.上面说到了递归调用。下面的这个就是实际的实现了读取一个目录下面所有的文件名,并且保存在一个CString数组中,而且还是详细的文件路径。
static void GetAllFilePathInDir( CStringArray &strArray, CString strDir, CString strExt )
{
 CFileFind finder;
 CString strFileName;
 if( strDir.IsEmpty() )
  return;
 if( strDir.Right(2) != "\\" )
  strDir = strDir + "\\";
 BOOL bWorking = finder.FindFile( strDir + "*.*" );
 while( bWorking )
 { 
  bWorking = finder.FindNextFile();
  
  if ( finder.IsDots() )
   continue;
  
  if ( finder.IsDirectory() )
  {
   GetAllFilePathInDir( strArray, finder.GetFilePath(), strExt );
   continue;
  }

  strFileName = finder.GetFilePath();
  strFileName.MakeLower();
  CString needExt = GetFileExt( strExt );
  CString srcExt = GetFileExt( strFileName );
  if( strExt == "*.*" || needExt == srcExt )
  {
   strArray.Add( strFileName );
  }
 } 

 finder.Close();
}
一个典型的调用参数就是下面的这个:
GetAllFilePathInDir(FilenameALL,szSourceFilename,"*.jpg");
 for (int i = 0; i < FilenameALL.GetSize(); i++)
 {
  ::MessageBox(NULL,FilenameALL.GetAt(i),"ok",MB_OK);
 }
注意,前面第一个参数是表示要存放的数组,第二个是你要查找的那个路径,第三个是查找的文件名。可以用通配符来实现查找。这样就完成了功能。
强大的MFC。。。。

posted on 2009-12-12 16:49 deercoder 阅读(1116) 评论(0)  编辑 收藏 引用 所属分类: MFC

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理