一个不起眼的小问题

类别:VC语言 点击:0 评论:0 推荐:

一个不起眼的小问题
李安东
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;
 }
就是一定要记得把“..”剔除,当然“.”也应该剔除掉。
 

本文地址:http://com.8s8s.com/it/it2493.htm