我想实现的功能是,在用户对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;
}
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;
}
解决方案 »
- Windows 8 支持C++本地代码
- 问个COM组件的问题
- 如何远程访问SQL SERVER 2005?
- 如何得到一个网页中的IE标题图标
- 解决就结贴! 我写了个用于科学计算的程序,我想将每次录入的计算数据和计算的结果用个文本文件保存起来,该怎么做啊?
- 这字符串转化真的很难啊?
- 出现“'IDR_TOOLBAR1' : undeclared identifier”的错误怎么调试??
- 用如下代码为何得不到状态条指针?
- SetWindowLong 和 SetClassLong 有什么区别?
- 求教消息映射 急!!!
- vc6.0编写SOAP的客户端怎么样调用WSDL的复杂类型?困扰了我好几天,麻烦高手帮忙!
- 程序只运行一个实例,并激活前一个实例。
这其中的原理是什么?我没有理解FindClose的意思.麻烦指教下?谢谢!
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;
}