一个不起眼的小问题
2002-06-03 15:04
337 查看
一个不起眼的小问题
李安东
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;
}
就是一定要记得把“..”剔除,当然“.”也应该剔除掉。
李安东
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;
}
就是一定要记得把“..”剔除,当然“.”也应该剔除掉。
相关文章推荐
- 计算机与操作系统启动原理
- Uedit32与SQLPlus结合使用技巧
- 独具量身定做特色的管理软件--数据大师
- ASP链接ORACLE的程序
- ASP链接MYSQL并读取数据的程序
- 修改BOOST(一)
- SQL Server和Oracle防止数据锁定的比较
- WSDL: 描述你的Web服务
- 为什么UDDI会成功?即使缄默无闻
- SOAP技术与B2B应用集成(1)
- SOAP技术与B2B应用集成(2)
- SOAP技术与B2B应用集成(3)
- SOAP技术与B2B应用集成(4)
- SOAP技术与B2B应用集成(5)
- 汉诺塔的源程序
- 架构Web Service:为什么需要Web服务?
- 架构Web Service:什么是Web服务?
- 架构Web Service:基于Web服务的应用、解决方案和开发平台
- 架构Web Service:实战Web服务
- 架构Web Service:交互界面,Web服务定义的核心