您的位置:首页 > 编程语言 > C语言/C++

C++ 删除一个文件目录下的所有文件以及目录

2014-12-12 09:29 447 查看
BOOL DoRemoveDirectory(CString chrDirName);

BOOL ReleaseDirectory(CString chrDirName)
{
    BOOL bRemove = DoRemoveDirectory(chrDirName);
    if (bRemove)
        ::RemoveDirectory(chrDirName);
    else
        return FALSE;

    return TRUE;

} //end of CIVMSvrInfo::ReleaseDirectory()

BOOL DoRemoveDirectory(CString chrDirName)
{
    CString strDirName = chrDirName;

    BOOL result;
    HANDLE Handle;
    WIN32_FIND_DATA fData;
    CString strTemp;
    DWORD errorcode;

    Handle = FindFirstFile(strDirName + "\\*.*", &fData);

    if (Handle == INVALID_HANDLE_VALUE)
        return FALSE;

    do {
        errorcode = GetLastError();

        if ( fData.cFileName[0] == '.' )
            continue;

        if (fData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {
            if (strDirName[strDirName.GetLength()-1] != '\\'){
                TCHAR chA[MAX_PATH];
                CString strA = strDirName+'\\'+ fData.cFileName;
                lstrcpy(chA, strA);
                DoRemoveDirectory(chA);
            }
            else{
                TCHAR chB[MAX_PATH];
                CString strB = strDirName + fData.cFileName;
                lstrcpy(chB, strB);
                DoRemoveDirectory(chB);
            }

            strTemp = strDirName + "\\" + fData.cFileName;

            SetFileAttributes(strTemp, ~FILE_ATTRIBUTE_READONLY);
            if (!RemoveDirectory(strTemp))
                result = FALSE;
            else
                result = TRUE;
        }
        else
        {
            strTemp = strDirName + "\\" + fData.cFileName;
            BOOL bl = SetFileAttributes(strTemp, ~FILE_ATTRIBUTE_READONLY);

            if (!DeleteFile(strTemp))
                result = FALSE;
            else
                result = TRUE;
        }

    }while(FindNextFile(Handle,&fData));

    errorcode = GetLastError();

    if (errorcode == ERROR_NO_MORE_FILES)
    {
        ::RemoveDirectory(strDirName);
        result = TRUE;
    }

    if (Handle)
        FindClose(Handle);

    return result;

}    // 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在控制.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: