RemoveDirectory删除文件夹失败解决方法 - 小众知识

RemoveDirectory删除文件夹失败解决方法

2013年01月27日 14:18:05 苏内容
  标签: 文件夹/删除
阅读:7328

我用RemoveDirectoryW删除某个文件夹下的所有文件,当我遍历删除完某层时,会遇到如果删除全部某层的全部文件,当再删除某层的目录,可是当返回到它的上层时,再次删除时,会提示还有文件,我发现那文件确实没有删除,但是确返回成功,而且只有程序运行完退出时才会自动删除某目录,然后还要遍历第二遍来删除余下的目录,但情况还是一而再再而三的出现,为何会出现这样的情况。难道就不能再次全部删除光么,非得删除好几遍,删除文件用DeleteFileW没事,但就是RemoveDirectoryW,弄了好久了,不行啊,求助啊。。。

Remarks
The RemoveDirectory function marks a directory for deletion on close. Therefore, the directory is not removed until the last handle to the directory is closed.
To recursively delete the files in a directory, use the SHFileOperation function.

SHFileOperation() 强行删除...

FindClose,你明白的,方便后来人吧


程序中调用RemoveDirectory来删除一个空目录,可总是返回FALSE,用GetLastError
得到的错误号是0,与这个错误号对应的描述是:
0 The operation completed successfully.  ERROR_SUCCESS
而且从资源管理器中可以看到文件夹确实没有被删除。
请问是怎么回事,谢谢~!
 
下面是源程序,VC6(SP5)。文件夹中的文件都可以成功删除的,可是最后一步要删除
文件夹时出错。
 
bool CIODlg::RemoveDirectory(const CString &strPathName)
{
    ASSERT(!strPathName.IsEmpty());
    ASSERT('\\' == strPathName[strPathName.GetLength()-1]);
 
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;
 
    hFind = FindFirstFile(strPathName+"*.*", &FindFileData);
    if(INVALID_HANDLE_VALUE == hFind) {
        return true;
    }
    try {
        while(true) {
            //is it a directory?
            if((FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                == FILE_ATTRIBUTE_DIRECTORY) { //a directory
                if(strcmp(FindFileData.cFileName, ".") == 0
                   || strcmp(FindFileData.cFileName , "..") == 0) {
                    ;
                } else {
                    CString strSubPathName = strPathName
                                             + FindFileData.cFileName
                                             +"\\";
                    //recur
                    if(!CIODlg::RemoveDirectory(strSubPathName)) {
                        return false;
                    }
                }
            } else {
                if(FALSE ==
                   ::DeleteFile(strPathName+FindFileData.cFileName)) {
                    return false;
                }
            }
            if(FALSE == FindNextFile(hFind, &FindFileData)) {
                break;
            }
        }
        if(FALSE == ::RemoveDirectory(strPathName)) {
            return false;
        }
    }
    catch(...) {
        AfxMessageBox("文件删除发生异常错误!",
                      MB_OK | MB_APPLMODAL | MB_ICONSTOP);
        return false;
    }
    return true;
}

我刚才在另一个程序中测试了一下,删除应用程序所在目录下的名为2的文件夹,这次却是成功的,可是我还是不知道刚才错在哪。

TCHAR strPathName[MAX_PATH] = {'\0'};
int nSize = GetModuleFileName(NULL, strPathName, MAX_PATH);
CString strPath(strPathName);
strPath = strPath.Left(strPath.ReverseFind('\\')+1);

if(FALSE == RemoveDirectory(strPath + "2\\")) {
    TRACE("错误号:%d\n", GetLastError());
} else {
    TRACE("Success!\n");
}

调试的时候,我明明看到strPathName的值为:
"F:\STRAVES\HERONG\毕业设计\OPTLibrary\Debug\Library\线性规划\"
当我在程序中用这个字符串(上面的'\'替换成'\\')去代替strPathName时,调用有时成功有时却也失败,真是搞不懂了。


//try it       
       FindClose(hFind);
       if(FALSE == ::RemoveDirectory(strPathName)) {
            return false;

扩展阅读