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

|