本帖最后由 wojiushi3344 于 2010-08-07 09:42:30 编辑

解决方案 »

  1.   

    难道说CFileDialog 和SHFileOperation(&lpsh)复制文件不能同用
    -------------
    本来就没一起使用啊,DOMODAL返回了对话框就就结束了
    lpsh.pTo = "res\\"; ==》更改成lpsh.pTo = "res\\Test.txt";
      

  2.   

    而且必须写绝对路径名,res\\Test.txt要指向当前目录下得res目录,而“当前目录”实际是你CFileDialog选中得那个文件所在得目录
      

  3.   

    但是我要怎么才能使在CFileDialog选中之后得到工程目录了现在我要做的就是在CFileDialog选中之后把选中的文件复制到工程目录下的RES文件夹下。。
      

  4.   

    用FileCopy这个API函数就得了呗
      

  5.   

    你这个函数还是不能把CFileDialog选中的文件拷贝到项目的工程目录下。。
      

  6.   

    下面我把我的代码贴出来希望大侠能够帮我解决我所遇到的问题
    void CReadTEXTDlg::Open()
    {
     char strtemp[100000];
    CFile   m_file;
    CString str;
    SHFILEOPSTRUCT  m_shfile;
        
    CFileDialog m_fileDlg(true,"","penghao",OFN_HIDEREADONLY, 
    "Text Files (*.txt)|*.txt|cpp Files (*.cpp)|*.cpp||");
    if (m_fileDlg.DoModal()==IDOK)
    {
    CString strtemp1;

    str=m_fileDlg.GetPathName(); ZeroMemory(&m_shfile,sizeof(m_shfile));
    m_shfile.hwnd =HWND_DESKTOP;
    m_shfile.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS;
    m_shfile.wFunc=FO_COPY;
    m_shfile.pFrom="C:\\AA.txt";
    m_shfile.pTo = "story\\";
    if(SHFileOperation(&m_shfile)==0)
    {
    AfxMessageBox("成功!"); }
    }


    //
    if (m_file.Open(str,CFile::modeRead))
    {

                 
    str=m_fileDlg.GetFileTitle(); int a=m_file.Read(strtemp,100000);
    strtemp[a-1]='\0';
    SetDlgItemText(IDC_EDIT1,strtemp);
     m_listBox.AddString(str);
                 
     if (m_listBox.GetCount()!=0)
     {
     hwnd=GetDlgItem(IDC_BUTTON1);
     hwnd->EnableWindow(true);
     hwnd=GetDlgItem(IDC_BUTTON2);
     hwnd->EnableWindow(true);
     
    } }else
    {
    AfxMessageBox("你要打开的文件不存在,请检查!");
    }

    }
    运行的时候报错   无法复制AA:文件名、目录名或卷标不正确。但是我把if (m_fileDlg.DoModal()==IDOK)注释掉就好了,不知道是什么原因有人说是当前目录不对,但是在m_fileDlg.DoModal()之后怎么把当前目录设置成工程目录了。
      

  7.   

    if(cfile.DoModal()==IDOK)
    {
    SHFILEOPSTRUCT lpsh;   ZeroMemory(&lpsh,sizeof(lpsh));   
    lpsh.hwnd= HWND_DESKTOP;   lpsh.fFlags=FOF_NOCONFIRMATION|FOF_SIMPLEPROGRESS ;   
    lpsh.wFunc=FO_COPY; // FO_MOVE 则是移动
    lpsh.pFrom= "C:\\Test.txt";
    lpsh.pTo = "res\\";   
    if( 0 != SHFileOperation(&lpsh))   
    {   
    AfxMessageBox("复制文件出错,请检查");   return ;   
    }
    }
    ========
    看得我头都晕了,你的CFileDialog好像没有发挥什么作用啊?你的源文件和目标文件都是定死了的:
    lpsh.pFrom= "C:\\Test.txt";
    lpsh.pTo = "res\\";   
    用不用CFileDialog都没关系啊
    另外出错的原因就在CFileDialog上。你的目标路径是:lpsh.pTo = "res\\"; 这里用的是相对路径,是相对于你的当前工作目录而言的,本来当前工作目录,你在VS中执行的话,就是工程目录,但是用了CFileDialog之后,如果选了一个文件,此时当前工作目录就成了你所选文件所在的目录了,打个比方,你在CFileDialog弹出的对话框中选了C:\\1.txt,然后按确定之后,此时当前工作目录就成了C:\了。
      

  8.   

    不知道是什么原因有人说是当前目录不对,但是在m_fileDlg.DoModal()之后怎么把当前目录设置成工程目录了。
    ========
    你弹出CFileDialog有什么用呢?你上面都没有用它。
      

  9.   

    如果你想在CFileDialog之后恢复原来的工作目录很简单啊,在CFileDialog.DoModal之前用GetCurrentDirectory 保存当前工作目录,在DoModal之后用 SetCurrentDirectory 恢复不就行了。
      

  10.   

    我知道我弹出CFileDialog没什么用 我就是想表达的是在弹出CFileDialog的时候当前目录就被改变了,现在我想把当前目录设置成工程目录,该怎么办!
      

  11.   

    我知道我弹出CFileDialog没什么用 我就是想表达的是在弹出CFileDialog的时候当前目录就被改变了,现在我想把当前目录设置成工程目录,该怎么办!
    =======
    上面已经说了,用GetCurrentDirectory 保存当前工作目录,在DoModal之后用 SetCurrentDirectory恢复就行了。
      

  12.   

    但是我下次有访问CFileDialog的时候肯定是要报错的呀,因为指针已经指向其他的地方了。。
      

  13.   

    但是我下次有访问CFileDialog的时候肯定是要报错的呀,因为指针已经指向其他的地方了。。
      

  14.   

    不会错的啊,CFileDialog它记录的是绝对路径。
      

  15.   

    1》CFileDialog可以不改变路径:
    fd.m_ofn.Flags|=OFN_NOCHANGEDIR;//keep same dir
    2》你可以设置初始路径:
    if(strlen(m_KeptPath)==0) fd.m_ofn.lpstrInitialDir="D:\\";
    else   fd.m_ofn.lpstrInitialDir=m_KeptPath;
    3》如果是多选:
    if (fd.DoModal()==IDOK)
    {// invalid file name will be prompted.
     // file existence will be checked
    // may be multi selection under one same directory
    POSITION pos=fd.GetStartPosition( );
    while (pos)
    {
    cstrArr.Add(fd.GetNextPathName(pos));

    4》把上面取来的路径(包括名)作为源文件名,目的文件名是源文件路径去除实际路径(即只要名)加上目的路径
      

  16.   

    工程目录复制一份  该怎么做  
    原文是这样的 
    为了节省篇幅,在工程InsertData(例2)的基础上来创建这样的MFC程序。方法是:将InsertData目录复制一份,并将复制后的目录名改为InsertData2,然后双击此目录下的InertData.dsw文件,打开文件InsertData。按照下列步骤进行补充: