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 閱讀(1185)
評論(0) 編輯 收藏 引用 所屬分類:
MFC