一个不起眼的小问题
李安东
2002年5月31日
对于C和C++程序员来说,一定对FindFirstFile() 和FindNextFile()这两个函数会有深厚的感情,但不知对于用下面的函数删除一棵子目录树,您会有何看法:
void RemoveThem(char *strPath)
{
char strTemFile[256];
strcpy(strTemFile,strPath);
strcat(strTemFile,"\\*.*");
WIN32_FIND_DATA FindFileData;
HANDLE hFind=FindFirstFile(strTemFile,&FindFileData);
if(hFind!=INVALID_HANDLE_VALUE)
while(TRUE)
{
strcpy(strTemFile,strPath);
strcat(strTemFile,"\\");
strcat(strTemFile,FindFileData.cFileName);
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
RemoveThem(strTemFile);//recursive call if it's a subdirectory.
}
else ::DeleteFile(strTemFile);//Delete it if it's a file.
if(!FindNextFile(hFind,&FindFileData)) break;
}
::CloseHandle(hFind);
::RemoveDirectory(strPath);
}
其中传递的初始参数strPath就是要被删除的子目录树的根。
表面上来看,这个函数似乎没什么问题,但如果真的使用它结果就惨了,实际上它会删除整个磁盘上的内容!
原因就是在用FindFirstFile() 和FindNextFile()寻找一棵子目录树时,所找到的头两个子目录一般是“.”和“..”。问题就出在“..”上,试想把一个路径中塞上几个“..”,那会是什么结果......实在是不敢想象。
这个问题虽不起眼,但它的后果却是不容忽视的,我想各位肯定早就注意到这个问题了,这里主要目的是给各位再次提一个醒,以免哪一天一不留神又掉了进去。
当然解决起来也很简单,只要在while(TRUE)循环的开头加上如下语句即可:
if(FindFileData.cFileName[0]=='.')
{
if(!FindNextFile(hFind,&FindFileData))break;
continue;
}
就是一定要记得把“..”剔除,当然“.”也应该剔除掉。