VC语言

本类阅读TOP10

·VC++ 学习笔记(二)
·用Visual C++打造IE浏览器(1)
·每个开发人员现在应该下载的十种必备工具
·教你用VC6做QQ对对碰外挂程序
·Netmsg 局域网聊天程序
·Windows消息大全
·VC++下使用ADO编写数据库程序
·VC++学习笔记(四)
·非法探取密码的原理及其防范
·怎样在VC++中访问、修改注册表

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
一个不起眼的小问题

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

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




相关文章

相关软件