我想实现的功能是,在用户对Folder做"Delete"操作的时候把Folder拷贝到一个特定的地方(D:\TestHook).在删除之前Folder是拷贝过去了.但删除操作无法继续执行了.系统提示"要删除的Folder被其他用户或进程占用,无法删除.".请高手指教.是什么原因?怎么解决呢?我的回调函数代码是:
UINT __stdcall CCopyHook::CopyCallback(HWND hwnd,UINT wFunc,UINT wFlags,
                               LPCTSTR pszSrcFile,DWORD dwSrcAttribs,
                               LPCTSTR pszDestFile,DWORD dwDestAttribs)
{
    TCHAR szMsg[MAX_PATH+14];
    TCHAR szFolerArg[MAX_PATH+14];    LPTSTR pszSrcFolder = (LPTSTR)pszSrcFile;
    LPTSTR pszDestFolder = _T("D:\\TestHOOK");    //在回调函数里面实现拷贝功能
    CopyDirectory(pszSrcFolder,pszDestFolder);    //开始时我以为是需要点延迟时间,所以加上一段循环,但好像不是这个原因.
    int i=10000;
    while(i)
    {
        i--;
    }    //拷贝完毕后提示用户是否继续删除
    wsprintf(szMsg,_T("对%s进行的操作"),pszSrcFile);
    return MessageBox(NULL,szMsg,_T("确认"),MB_YESNO|MB_ICONEXCLAMATION);
}//CopyDirectory函数的实现:
BOOL CopyDirectory(LPTSTR   strSrcPath,   LPTSTR   strDestPath)   
{   
    HANDLE HResult;   
    WIN32_FIND_DATA   FindFileData;   
    TCHAR  strSrcFileName[MAX_PATH],strDestFileName[MAX_PATH];   
    BOOL  blResult;   
    HResult = FindFirstFile(strSrcPath,&FindFileData);       if(HResult == INVALID_HANDLE_VALUE)     
return FALSE   ;   
  
    if(strSrcPath[strlen(strSrcPath) - 1] == '\\')   
strSrcPath[strlen(strSrcPath) - 1] = '\0';       if(strSrcPath[strlen(strDestPath) - 1]   ==   '\\')   
strSrcPath[strlen(strDestPath) - 1]   =   '\0';       HResult = FindFirstFile(strDestPath, &FindFileData);       if(HResult == INVALID_HANDLE_VALUE)    
CreateDirectory(strDestPath   ,NULL);       StrCpy(strSrcFileName,strSrcPath);   
    StrCat(strSrcFileName,"\\*");       HResult = FindFirstFile(strSrcFileName,&FindFileData);   
    if(HResult == INVALID_HANDLE_VALUE)     
return FALSE;        if(StrCmp(FindFileData.cFileName, _T(".")) 
        && StrCmp(FindFileData.cFileName,_T("..")))   
    {    
StrCpy(strSrcFileName,strSrcPath);   
StrCat(strSrcFileName,"\\");   
StrCat(strSrcFileName,FindFileData.cFileName);   
StrCpy(strDestFileName,strDestPath);   
StrCat(strDestFileName,"\\");   
StrCat(strDestFileName,FindFileData.cFileName);    if(FindFileData.dwFileAttributes 
             & FILE_ATTRIBUTE_DIRECTORY == FILE_ATTRIBUTE_DIRECTORY)     
CopyDirectory(strSrcFileName,strDestFileName);    
else     
CopyFile(strSrcFileName,strDestFileName,FALSE);     
    }   
    while(1)   
    {   
blResult = FindNextFile(HResult,&FindFileData);   
if(!blResult)   
    break;    if(StrCmp(FindFileData.cFileName,_T("."))
              &&StrCmp(FindFileData.cFileName,_T("..")))        
         {   
    StrCpy(strSrcFileName,strSrcPath);   
    StrCat(strSrcFileName,"\\");   
    StrCat(strSrcFileName,FindFileData.cFileName);   
    StrCpy(strDestFileName,strDestPath);   
    StrCat(strDestFileName,"\\");   
    StrCat(strDestFileName,FindFileData.cFileName);        DWORD wFlag = FindFileData.dwFileAttributes 
                             & FILE_ATTRIBUTE_DIRECTORY;
    if(wFlag == FILE_ATTRIBUTE_DIRECTORY)          CopyDirectory(strSrcFileName,strDestFileName);     
    else      
        CopyFile(strSrcFileName,strDestFileName,FALSE);    
}   
     }   
     return TRUE;   
}

解决方案 »

  1.   

    我在另外一篇回答你了,你没有调用FindClose,这样就把你的hResult leak了,直接导致目录被锁死。用完Handle一定要关掉,这个Leak比Memory Leak还有危害。你的程序被调用到Shell(Explorer)的进程里面,用户最后无法进行目录操作,只能重启动,然后删除的时候又被你锁死。:) 倒是个保护方法。
      

  2.   

    Re:feimingbiao()    我照你的方法做了.就是在函数CopyDirectory的最好加了一行FindClose(HResult),虽然删除空目录没有问题了.但如果删除的目录包含目录或者文件的时候,还是无法删除.
    这其中的原理是什么?我没有理解FindClose的意思.麻烦指教下?谢谢!
      

  3.   

    原因找到了.我对三个Folder进行过FindFirstFile.虽然对最后一个Folder执行FindClose了.但没有对之前的两个Folder执行FindClose.谢谢!
      

  4.   

    看了楼主的帖子......苦不堪言,对着优化重写了一下,虽然是07年的帖子,还是顶一下吧,我现在也是在做复制目录这个功能.//CopyDirectory("C:\\123", "D:\\456");
    BOOL CopyDirectory(LPCTSTR strSrcPath, LPCTSTR strDestPath)
    {
    HANDLE hFile;
    WIN32_FIND_DATA wfd;
    TCHAR strSrcFilePath[MAX_PATH], strDestFilePath[MAX_PATH]; lstrcpy(strSrcFilePath, strSrcPath);
    lstrcat(strSrcFilePath, _T("\\*.*")); hFile = FindFirstFile(strSrcFilePath, &wfd);
    if(hFile == INVALID_HANDLE_VALUE) return FALSE;
    do
    {
    if (lstrcmpi(wfd.cFileName, _T(".")) == 0 || lstrcmpi(wfd.cFileName, _T("..")) == 0) continue;
    wsprintf(strSrcFilePath, _T("%s\\%s"), strSrcPath, wfd.cFileName);
    wsprintf(strDestFilePath, _T("%s\\%s"), strDestPath, wfd.cFileName);
    if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
    CopyDirectory(strSrcFilePath, strDestFilePath);
    }
    else
    {
    CopyFile(strSrcFilePath, strDestFilePath, FALSE);
    }
    } while (FindNextFile(hFile, &wfd));
    FindClose(hFile);
    return TRUE;
    }