高版本的MS-DOS和Windows95 都提供了一个可以删除一个或多个目录及其下属文 件和目录的命令,即DeleteTree命令。然而,无论在MFC类库 还是在Win32函数库中,都没有相应的函数与之对应。这 样,当我们在自己设计的应用程序中需要用到DeleteTree 的功能时,自然想到的方法是通过进程调用或者系统 调用的方式(正如上面部分所述的那样)调用MD-DOS或Windows 95下的DeleteTree命令。然而,Win32函数库已经为我们提供了多种用于文件和目录操作的函数,利用它们不难设计出自己的DeleteTree()函数。读者读到这里,也许会感到有些疑惑,为什么第六部分强调进程调用优于自我设计的函数,而这一部分又反了过来?是的,在通常情况下,调用应用程序内部的函数比使用进程或者调用外部函数更灵活并且可以提高执行效率,也便于修改。所以,象DeleteTree()这样的功能,利用现有的函数并不难实现,自然就最好通过内部函数的方式来完成。然而,象设计一个压缩/解压缩这样的函数的工作量,并不比通过进程调用来使用现成品的开销更合算,因为它至少需要我们了解压缩/解压缩的复杂算法,而且调试和维护它也需要一定代价。于是,这个时候,还是采用“拿来主义”为好。
下面,给出我自己设计的DeleteTree()函数,仅供参考。
BOOL DeleteTree(CString DirName) { //成功:返回TRUE;否则,返回FALSE BOOL Result; Result=PreRemoveDirectory(DirName) && RemoveDirectory(DirName); return Result; } BOOL PreRemoveDirectory(CString DirName) {//成功:返回TRUE;否则,返回FALSE LPTSTR lpBuffer; UINT uSize; CString fileName; HANDLE hHeap; BOOL result; HANDLE hFindFile; WIN32_FIND_DATA FindFileData; uSize=(GetCurrentDirectory(0,NULL))*sizeof(TCHAR); hHeap=GetProcessHeap(); lpBuffer=(LPSTR)HeapAlloc(hHeap,HEAP_ZERO_MEMORY,uSize); GetCurrentDirectory(uSize,lpBuffer); if (lpBuffer!=DirName) {//调整当前目录 SetCurrentDirectory(DirName); } hFindFile=FindFirstFile("*.*",&FindFileData); CString tFile; if (hFindFile!=INVALID_HANDLE_VALUE) { do { tFile=FindFileData.cFileName; if ((tFile==".")||(tFile=="..")) continue; if (FindFileData.dwFileAttributes== FILE_ATTRIBUTE_DIRECTORY){ if (DirName[DirName.GetLength()-1]!='\\') PreRemoveDirectory(DirName+'\\'+tFile); else PreRemoveDirectory(DirName+tFile); if (!RemoveDirectory(tFile)) result=FALSE; else result=TRUE; } else if (!DeleteFile(tFile)) result=FALSE; else result=TRUE; } while (FindNextFile(hFindFile,&FindFileData)); FindClose(hFindFile); } else { SetCurrentDirectory(lpBuffer); return FALSE; } SetCurrentDirectory(lpBuffer); //回复到原来的目录下 return result; }