zoukankan      html  css  js  c++  java
  • VC++ 删除一个文件目录下的所有文件以及目录

     1 BOOL DoRemoveDirectory(CString chrDirName);
     2 
     3 BOOL ReleaseDirectory(CString chrDirName)
     4 {
     5     BOOL bRemove = DoRemoveDirectory(chrDirName);
     6     if (bRemove)
     7         ::RemoveDirectory(chrDirName);
     8     else
     9         return FALSE;
    10 
    11     return TRUE;
    12 
    13 } //end of CIVMSvrInfo::ReleaseDirectory()
    14 
    15 BOOL DoRemoveDirectory(CString chrDirName)
    16 {
    17     CString strDirName = chrDirName;
    18 
    19     BOOL result;
    20     HANDLE Handle;
    21     WIN32_FIND_DATA fData;
    22     CString strTemp;
    23     DWORD errorcode;
    24 
    25     Handle = FindFirstFile(strDirName + "\*.*", &fData);
    26 
    27     if (Handle == INVALID_HANDLE_VALUE)
    28         return FALSE;
    29 
    30     do {
    31         errorcode = GetLastError();
    32 
    33         if ( fData.cFileName[0] == '.' )
    34             continue;
    35 
    36         if (fData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {
    37             if (strDirName[strDirName.GetLength()-1] != '\'){
    38                 TCHAR chA[MAX_PATH];
    39                 CString strA = strDirName+'\'+ fData.cFileName;
    40                 lstrcpy(chA, strA);
    41                 DoRemoveDirectory(chA);
    42             }
    43             else{
    44                 TCHAR chB[MAX_PATH];
    45                 CString strB = strDirName + fData.cFileName;
    46                 lstrcpy(chB, strB);
    47                 DoRemoveDirectory(chB);
    48             }
    49 
    50             strTemp = strDirName + "\" + fData.cFileName;
    51 
    52             SetFileAttributes(strTemp, ~FILE_ATTRIBUTE_READONLY);
    53             if (!RemoveDirectory(strTemp))
    54                 result = FALSE;
    55             else
    56                 result = TRUE;
    57         }
    58         else
    59         {
    60             strTemp = strDirName + "\" + fData.cFileName;
    61             BOOL bl = SetFileAttributes(strTemp, ~FILE_ATTRIBUTE_READONLY);
    62 
    63             if (!DeleteFile(strTemp))
    64                 result = FALSE;
    65             else
    66                 result = TRUE;
    67         }
    68 
    69     }while(FindNextFile(Handle,&fData));
    70 
    71     errorcode = GetLastError();
    72 
    73     if (errorcode == ERROR_NO_MORE_FILES)//空目录
    74     {
    75         ::RemoveDirectory(strDirName);
    76         result = TRUE;
    77     }
    78 
    79     if (Handle)
    80         FindClose(Handle);
    81 
    82     return result;
    83 
    84 }    // end of BOOL PreRemoveDirectory(CString DirName)

    在上述代码中

    FindFirstFile第一个参数需要一个路径,但要写*.*,表示从所有文件中找到的第一个.但写f:或者f:双斜杠都返回无效句柄.

    如果f:\1.txt 则对特定文件进行搜索,返回找到的第一个

    找到的文件的文件结构被记录在WIN32_FIND_DATA结构体里

    FindNextFile第一个参数是FindFirstFile的返回值,可以接着上次结果继续寻找

    但注意!!!!

    但一个目录的文件被搜索一遍后,FindNextFile返回的WIN32_FIND_DATA结构体将重复找到最后一个找到的文件,而不会终止.

    让循环结束的方法就是找上一次的报错码,然后看有没有ERROR_NO_MORE_FILES信息发生.

    hFile的有效与否个人觉得还是取决于第一次的FindFirstFile结果,本程序后半段的运行主要还是errorcode!=ERROR_NO_MORE_FILES在控制.

  • 相关阅读:
    【11.5】生成器进阶--send、close和throw方法
    【11.4】协程是什么?
    【python】IO多路复用(select、poll、epoll)介绍及select、epoll的实现
    【11.3】select+回调+事件循环获取html
    【11.2】C10K问题和io多路复用(select、poll和epoll)
    【11.1】并发、并行、同步、异步、阻塞、非阻塞
    【10.10】进程间通信--Queue、Pipe、Manager
    set autotrace on 报cannot set autotrace 错误解决方法
    通配符获取文件
    日期函数
  • 原文地址:https://www.cnblogs.com/chechen/p/4159027.html
Copyright © 2011-2022 走看看