如何实现整个文件夹的拷贝、移动、删除 等操作? 各位大虾:你们好! 小女子急需VC程序实现文件夹拷贝、移动、删除的方法,如哪位能够指点一二,不胜感激! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void COperationDlg::OnDel2(CString m_strFileDictory) //参数就是目录的路径{ if(m_strFileDictory.GetLength()==0) { ::AfxMessageBox ("目录名非法!",MB_OK|MB_ICONEXCLAMATION); return; } char FromFileName[80]="\0"; strcpy(FromFileName,m_strFileDictory); strcat(FromFileName,"\0"); SHFILEOPSTRUCT lpFileOp; lpFileOp.hwnd =GetSafeHwnd(); lpFileOp.wFunc =FO_DELETE; lpFileOp.pFrom =FromFileName; lpFileOp.pTo=NULL; lpFileOp.fFlags =FOF_SILENT|FOF_NOCONFIRMATION; lpFileOp.fAnyOperationsAborted =FALSE; lpFileOp.hNameMappings =NULL; lpFileOp.lpszProgressTitle =NULL; int rval=SHFileOperation(&lpFileOp); if(rval==0) { if(lpFileOp.fAnyOperationsAborted ==TRUE) ::AfxMessageBox ("删除目录操作取消",MB_OK); else ::AfxMessageBox("删除目录操作成功!",MB_OK|MB_ICONEXCLAMATION); } else { ::AfxMessageBox ("删除目录操作失败!",MB_OK|MB_ICONEXCLAMATION); }} 上面的是删除,拷贝BOOL CCutfoldDlg::CopyDirectory(CString SourcePath,CString CopytoPath){ CFileFind tempFind; char tempFileFind[200]; char tempFileFind1[200]; SECURITY_ATTRIBUTES lpSecurityDescriptor; CreateDirectory(CopytoPath,&lpSecurityDescriptor);/* { if(::MessageBox(0,"文件已经存在,是否覆盖?","警告",MB_ICONQUESTION|MB_YESNO)==IDNO) return FALSE; }*/ sprintf(tempFileFind1,"%s\\*.*",CopytoPath); sprintf(tempFileFind,"%s\\*.*",SourcePath); BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);// BOOL IsFinded1=(BOOL)tempFind.FindFile(tempFileFind1); while(IsFinded) { IsFinded=(BOOL)tempFind.FindNextFile(); if(!tempFind.IsDots()) { char foundFileName[200];// char foundFileName1[200]; strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));// strcpy(foundFileName1,tempFind.GetFileName().GetBuffer(200)); if(tempFind.IsDirectory()) { char tempDir[200]; char tempDir1[200]; sprintf(tempDir,"%s\\%s",SourcePath,foundFileName); sprintf(tempDir1,"%s\\%s",CopytoPath,foundFileName); CopyDirectory(tempDir,tempDir1); } else { char tempFileName[200]; char tempFileName1[200]; sprintf(tempFileName,"%s\\%s",SourcePath,foundFileName); sprintf(tempFileName1,"%s\\%s",CopytoPath,foundFileName); //DeleteFile(tempFileName); CopyFile(tempFileName,tempFileName1,0); } } } tempFind.Close(); return TRUE;} 要实现移动,遍历文件+MoveFile+CreateDirectory遍历方法参考:HANDLE hFind;WIN32_FIND_DATA dataFind;BOOL bMoreFiles=TRUE;hFind=FindFirstFile(sPath+"\\*.txt",&dataFind);////sPath表示路径while(hFind!=INVALID_HANDLE_VALUE && bMoreFiles==TRUE){ if(dataFind.dwFileAttributes==FILE_ATTRIBUTE_ARCHIVE) { MessageBox(dataFind.cFileName); } bMoreFiles=FindNextFile(hFind,&dataFind);}FindClose(hFind); 复制文件夹SHFILEOPSTRUCT Op; char FromBuf[]="E:\\temp\0"; char ToBuf[]="\\\\SINTEKSERVER\\个人文档\\陈 伟\0";; Op.hwnd = NULL; Op.wFunc = FO_COPY; Op.pFrom = FromBuf; Op.pTo = ToBuf; Op.fFlags = FOF_NOCONFIRMATION | FOF_RENAMEONCOLLISION ; Op.fAnyOperationsAborted = FALSE; Op.hNameMappings = NULL; Op.lpszProgressTitle = NULL; if(SHFileOperation(&Op) == 0) MessageBox("复制完毕","提示",MB_OK|MB_ICONINFORMATION); 晕,用得着这么复杂吗。用SHFileOperation都可以搞定。为什么复制移动还要遍历呢? 不过用SHFileOperation一定要注意SHFILEOPSTRUCT的lpFrom和lpTo必须以两个NULL结尾,小心了。 hWnd一般设置为程序主窗口的句柄。MSDN中有该函数的详细说明。 我用一下代码,怎么总是不成功,显示信息说“无法复制 文件:无法读源文件或磁盘!” SHFILEOPSTRUCT Op; char FromBuf[] =_T("E:\\试验1\\t11"); char ToBuf[] = _T("E:\\试验2"); Op.hwnd = GetSafeHwnd(); Op.wFunc = FO_COPY; Op.pFrom = FromBuf; Op.pTo = ToBuf; Op.fFlags = FOF_NOCONFIRMATION | FOF_RENAMEONCOLLISION ; Op.fAnyOperationsAborted = FALSE; Op.hNameMappings = NULL; Op.lpszProgressTitle = NULL; if(SHFileOperation(&Op) == 0) MessageBox("复制完毕","提示",MB_OK|MB_ICONINFORMATION); 我用以下代码,也是不成功,显示信息说“无法删除 文件:无法读源文件或磁盘!” char dir[]=_T("E:\\试验1\\t11"); SHFILEOPSTRUCT lpFileOp; lpFileOp.hwnd =GetSafeHwnd();; lpFileOp.wFunc =FO_DELETE; lpFileOp.pFrom =dir; lpFileOp.pTo=NULL; lpFileOp.fFlags =FOF_SILENT|FOF_NOCONFIRMATION; lpFileOp.fAnyOperationsAborted =FALSE; lpFileOp.hNameMappings =NULL; lpFileOp.lpszProgressTitle =NULL; int rval=SHFileOperation(&lpFileOp); if(rval==0) { if(lpFileOp.fAnyOperationsAborted ==TRUE) ::AfxMessageBox ("删除目录操作取消",MB_OK); else ::AfxMessageBox("删除目录操作成功!",MB_OK|MB_ICONEXCLAMATION); } else { ::AfxMessageBox ("删除目录操作失败!",MB_OK|MB_ICONEXCLAMATION); } 这是什么意思啊:lpFrom和lpTo必须以两个NULL结尾 你把pFrom和pTo后面改成两个NULL试下。看一下因为pFrom和pTo可以是一组文件(目录)名的列表,所以最后以两个NULL结尾。微软很多东西都是这样的。 HWND是执行操作过程中,如果需要显示什么提示的话,所用到的主窗口。关于两个NULL,当初我也整了一会才知道。给你我的代码: static bool WFileOperation(UINT wFunc,LPCSTR szFrom,LPCSTR szTo) { LPSTR szF=NULL,szT=NULL; if(szFrom) { int iLen=strlen(szFrom)+2; szF=new char[iLen]; ZeroMemory(szF,iLen); lstrcpy(szF,szFrom); } if(szTo) { int iLen=strlen(szTo)+2; szT=new char[iLen]; ZeroMemory(szT,iLen); lstrcpy(szT,szTo); } SHFILEOPSTRUCT sfo={0}; sfo.hwnd=NULL; sfo.pFrom=szF; sfo.pTo=szT; sfo.wFunc=wFunc; sfo.fFlags=FOF_NOCONFIRMATION|FOF_SILENT|0x2000; bool fRet=false; if(0==SHFileOperation(&sfo))fRet=true;; delete szF; delete szT; return fRet; } 看了一下你的代码,就是两个NULL的问题,改过来就对了。 TerminateProcess 结束其他进程导致services.exe关机,求解释 如何实现xp系统中浏览文件是的左边面板功能? logfont和textmetric之间的关系和异同 从位图创建区域 MFC List控件使用 如何在一级菜单的文字前面加一个ico或者bmp图标 如何快速地找出大容量数组中是否存在一指定元素 高分请教,在VC下如何取MAC地址 有关串行通信问题 winsock程序在本机中运行的好好的,为什么放在局域网中就有问题? 如何用绑定数据的方法为数据库增加一条新记录(ADO)?谢谢! WEB中ActiveX控件显示问题(又是夜幕降临)
{
if(m_strFileDictory.GetLength()==0)
{
::AfxMessageBox ("目录名非法!",MB_OK|MB_ICONEXCLAMATION);
return;
}
char FromFileName[80]="\0";
strcpy(FromFileName,m_strFileDictory);
strcat(FromFileName,"\0");
SHFILEOPSTRUCT lpFileOp;
lpFileOp.hwnd =GetSafeHwnd();
lpFileOp.wFunc =FO_DELETE;
lpFileOp.pFrom =FromFileName;
lpFileOp.pTo=NULL;
lpFileOp.fFlags =FOF_SILENT|FOF_NOCONFIRMATION;
lpFileOp.fAnyOperationsAborted =FALSE;
lpFileOp.hNameMappings =NULL;
lpFileOp.lpszProgressTitle =NULL;
int rval=SHFileOperation(&lpFileOp);
if(rval==0)
{
if(lpFileOp.fAnyOperationsAborted ==TRUE)
::AfxMessageBox ("删除目录操作取消",MB_OK);
else
::AfxMessageBox("删除目录操作成功!",MB_OK|MB_ICONEXCLAMATION);
}
else
{
::AfxMessageBox ("删除目录操作失败!",MB_OK|MB_ICONEXCLAMATION);
}
}
拷贝
BOOL CCutfoldDlg::CopyDirectory(CString SourcePath,CString CopytoPath)
{
CFileFind tempFind;
char tempFileFind[200];
char tempFileFind1[200]; SECURITY_ATTRIBUTES lpSecurityDescriptor;
CreateDirectory(CopytoPath,&lpSecurityDescriptor);
/* {
if(::MessageBox(0,"文件已经存在,是否覆盖?","警告",MB_ICONQUESTION|MB_YESNO)==IDNO)
return FALSE;
}
*/
sprintf(tempFileFind1,"%s\\*.*",CopytoPath);
sprintf(tempFileFind,"%s\\*.*",SourcePath);
BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
// BOOL IsFinded1=(BOOL)tempFind.FindFile(tempFileFind1);
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile();
if(!tempFind.IsDots())
{
char foundFileName[200];
// char foundFileName1[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
// strcpy(foundFileName1,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory())
{
char tempDir[200];
char tempDir1[200];
sprintf(tempDir,"%s\\%s",SourcePath,foundFileName);
sprintf(tempDir1,"%s\\%s",CopytoPath,foundFileName);
CopyDirectory(tempDir,tempDir1);
}
else
{
char tempFileName[200];
char tempFileName1[200];
sprintf(tempFileName,"%s\\%s",SourcePath,foundFileName);
sprintf(tempFileName1,"%s\\%s",CopytoPath,foundFileName);
//DeleteFile(tempFileName);
CopyFile(tempFileName,tempFileName1,0);
}
}
}
tempFind.Close();
return TRUE;
}
遍历方法参考:
HANDLE hFind;
WIN32_FIND_DATA dataFind;
BOOL bMoreFiles=TRUE;
hFind=FindFirstFile(sPath+"\\*.txt",&dataFind);////sPath表示路径
while(hFind!=INVALID_HANDLE_VALUE && bMoreFiles==TRUE)
{
if(dataFind.dwFileAttributes==FILE_ATTRIBUTE_ARCHIVE)
{
MessageBox(dataFind.cFileName);
}
bMoreFiles=FindNextFile(hFind,&dataFind);
}
FindClose(hFind);
char FromBuf[]="E:\\temp\0";
char ToBuf[]="\\\\SINTEKSERVER\\个人文档\\陈 伟\0";;
Op.hwnd = NULL;
Op.wFunc = FO_COPY;
Op.pFrom = FromBuf;
Op.pTo = ToBuf;
Op.fFlags = FOF_NOCONFIRMATION | FOF_RENAMEONCOLLISION ;
Op.fAnyOperationsAborted = FALSE;
Op.hNameMappings = NULL;
Op.lpszProgressTitle = NULL;
if(SHFileOperation(&Op) == 0)
MessageBox("复制完毕","提示",MB_OK|MB_ICONINFORMATION);
SHFILEOPSTRUCT Op;
char FromBuf[] =_T("E:\\试验1\\t11");
char ToBuf[] = _T("E:\\试验2");
Op.hwnd = GetSafeHwnd();
Op.wFunc = FO_COPY;
Op.pFrom = FromBuf;
Op.pTo = ToBuf;
Op.fFlags = FOF_NOCONFIRMATION | FOF_RENAMEONCOLLISION ;
Op.fAnyOperationsAborted = FALSE;
Op.hNameMappings = NULL;
Op.lpszProgressTitle = NULL;
if(SHFileOperation(&Op) == 0)
MessageBox("复制完毕","提示",MB_OK|MB_ICONINFORMATION);
char dir[]=_T("E:\\试验1\\t11");
SHFILEOPSTRUCT lpFileOp;
lpFileOp.hwnd =GetSafeHwnd();;
lpFileOp.wFunc =FO_DELETE;
lpFileOp.pFrom =dir;
lpFileOp.pTo=NULL;
lpFileOp.fFlags =FOF_SILENT|FOF_NOCONFIRMATION;
lpFileOp.fAnyOperationsAborted =FALSE;
lpFileOp.hNameMappings =NULL;
lpFileOp.lpszProgressTitle =NULL;
int rval=SHFileOperation(&lpFileOp);
if(rval==0)
{
if(lpFileOp.fAnyOperationsAborted ==TRUE)
::AfxMessageBox ("删除目录操作取消",MB_OK);
else
::AfxMessageBox("删除目录操作成功!",MB_OK|MB_ICONEXCLAMATION);
}
else
{
::AfxMessageBox ("删除目录操作失败!",MB_OK|MB_ICONEXCLAMATION);
}
{
LPSTR szF=NULL,szT=NULL;
if(szFrom)
{
int iLen=strlen(szFrom)+2;
szF=new char[iLen];
ZeroMemory(szF,iLen);
lstrcpy(szF,szFrom);
}
if(szTo)
{
int iLen=strlen(szTo)+2;
szT=new char[iLen];
ZeroMemory(szT,iLen);
lstrcpy(szT,szTo);
}
SHFILEOPSTRUCT sfo={0};
sfo.hwnd=NULL;
sfo.pFrom=szF;
sfo.pTo=szT;
sfo.wFunc=wFunc;
sfo.fFlags=FOF_NOCONFIRMATION|FOF_SILENT|0x2000;
bool fRet=false;
if(0==SHFileOperation(&sfo))fRet=true;;
delete szF;
delete szT;
return fRet;
}