各位大虾:你们好!
    小女子急需VC程序实现文件夹拷贝、移动、删除的方法,如哪位能够指点一二,不胜感激!

解决方案 »

  1.   

    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);
        }
    }
      

  2.   

    上面的是删除,
    拷贝
    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;
    }
      

  3.   

    要实现移动,遍历文件+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);
      

  4.   

    复制文件夹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);
      

  5.   

    晕,用得着这么复杂吗。用SHFileOperation都可以搞定。为什么复制移动还要遍历呢?
      

  6.   

    不过用SHFileOperation一定要注意SHFILEOPSTRUCT的lpFrom和lpTo必须以两个NULL结尾,小心了。
      

  7.   

    hWnd一般设置为程序主窗口的句柄。MSDN中有该函数的详细说明。
      

  8.   

    我用一下代码,怎么总是不成功,显示信息说“无法复制 文件:无法读源文件或磁盘!”
    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);
      

  9.   

    我用以下代码,也是不成功,显示信息说“无法删除 文件:无法读源文件或磁盘!”
        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);
        }
      

  10.   

    这是什么意思啊:lpFrom和lpTo必须以两个NULL结尾
      

  11.   

    你把pFrom和pTo后面改成两个NULL试下。看一下因为pFrom和pTo可以是一组文件(目录)名的列表,所以最后以两个NULL结尾。微软很多东西都是这样的。
      

  12.   

    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;
    }
      

  13.   

    看了一下你的代码,就是两个NULL的问题,改过来就对了。