• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

一个不起眼的小问题

发布: 2007-7-01 20:40 | 作者: admin | 来源: | 查看: 13次 | 进入软件测试论坛讨论

领测软件测试网

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


文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网