一个不起眼的小问题

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

一个不起眼的小问题

李安东

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;

}

就是一定要记得把“..”剔除,当然“.”也应该剔除掉。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航