我在一本书上看见了如下遍历目录的方法,代码如下:
HANDLE hFind;
WIN32_FIND_DATA dataFind;
BOOL bMoreFiles=TRUE;
CString strFile;
hFind=FindFirstFile(somedirectory+"\\*.*",&dataFind);
//somedirectory代表某个目录是CString类型;
while(hFind!=INVALID_HANDLE_VALUE&&bMoreFiles==TRUE){
if(dataFind.dwFileAttributes==FILE_ATTRIBUTE_ARCHIVE){
strFile=dataFind.cFileName; //如果是文件
……
}else if(dataFind.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY){
strFile=dataFind.cFileName; //如果是目录
……
}
bMoreFiles=FindNextFile(hFind,&dataFind);
}
FindClose(hFind);
可是在使用中发现判断目录还是文件的语句有问题。
一般一个目录或文件有三个属性:只读、隐藏、存档。
以目录判断为例:若这三个属性都不选中则用下面的
语句就可以判断出来:
dataFind.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY
若选中了只读属性,则上面的语句就不行了必须改为:
dataFind.dwFileAttributes==
FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_READONLY
同理,若选中了隐藏就得改为:
dataFind.dwFileAttributes==
FILE_ATTRIBUTE_DIRECTORY+FILE_ATTRIBUTE_HIDDEN
这样问题就来了,若你只想把文件和目录分开而不关心他们
的属性那么判断语句将会变得非常复杂。
dataFind.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY
||dataFind.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY+
FILE_ATTRIBUTE_READONLY
||dataFind.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY+
FILE_ATTRIBUTE_ARCHIVE
||dataFind.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY+
FILE_ATTRIBUTE_HIDDEN
这还只是一小部分,因为有的目录会同时选中两个或三个属性,
若想判断所有情况就会更复杂。
而且例程中的dataFind.dwFileAttributes==FILE_ATTRIBUTE_ARCHIVE
语句根本不能用来判断是否是文件,它只是判断是否含有存档属性。
那么有没有朋友知道简单的遍历目录的方法,或简单的判断方法?
CFileFind finder;
CString strFinder= _T(".\\plugin\\*.npp");
BOOL bFinished = finder.FindFile(strFinder);
while (bFinished)
{
bFinished = finder.FindNextFile();
if (finder.IsDots())
continue;
CString strFileName = finder.GetFilePath();
//do something else......
}
finder.Close();
if((dataFind.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
{
//是目录
}
用递归算法就行,其实目录也是文件,用*代表目录下的所有文件和目录,*.代表目录下的所有子目录,*.*代表目录下的所有文件