我用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;