编了一个拷贝文件以及文件夹的小程序(编译环境:C++ builder 6.0)
结果发现了一个近乎神经病的问题比如:原文件的路径是D:\工,没问题拷!
可是把文件名改改怎么样,就改成D:\工具,只是在原来的文件夹上多加了一个字而已,但是在运行是却出现“无法复制 文件:无法读源文件或磁盘”,别急继续看,将文件名再加上一个字(一定要是汉字,不能是字母或是数字),
改成D:\工具箱,在运行,没问题啦,不要高兴的太早继续加,改成D:\工具箱里
运行,完了!又出现“无法复制 文件:无法读源文件或磁盘”,在加一个字,改成D:\工具箱里的 又没问题了,继续改成D:\工具箱里的工,问题有来了,再改!七个字,正常,八个字,出错。
找到规律了,文件名如果是汉字,且一个以上,双数则正常,单数则出错!大家说说是不是SHFileOperation函数发神经了!那如果有其他的字符呢?
回答是:一样,如果文件夹名字全是字符或全是数字或是字符和数字混合(不能有汉字)那么如果当字符量可以被4整除时(如 4个,8个,12个)就会出现错误.当函数与字符数字混合时,汉字为双数其他为可被4整除时就会出错,出现“无法复制 文件:无法读源文件或磁盘”,的对话框。想了很久也想不明白,到底错在那里
程序源码如下:void __fastcall TForm1::Button1Click(TObject *Sender)
{
    String form,to;
    form=Edit1->Text;
    to=Edit2->Text;
    SHFILEOPSTRUCT op;
    op.hwnd=Handle;
    op.wFunc=FO_COPY;
    op.pFrom=form.c_str();
    op.pTo=to.c_str();
    op.fFlags=FOF_ALLOWUNDO;
    op.fAnyOperationsAborted=true;
    op.hNameMappings=NULL;
    op.lpszProgressTitle=NULL;
    int msg=SHFileOperationA(&op);
    if(msg==0)
    {
        if(op.fAnyOperationsAborted==true)
            ShowMessage("文件复制失败!");
        else
            ShowMessage("文件复制成功!");
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Edit2->Text="c:\\";
}
//---------------------------------------------------------------------------
想请大家帮帮忙,解决一下这个莫明其妙的问题,多谢了!

解决方案 »

  1.   

    以\0\0结尾没有用试过了,
    那个Edit2->Text="c:\\";指示的是目标地址,但是现在有问题的是源地址
      

  2.   

    hehe ...
    LZ 专研问题精神真是让我佩服..
    也许LS所说吧,  UP.
      

  3.   

    呵呵. 看LZ那么执着 我就来实验了下.我的改动:
    使用char from[20];char to[20]; hWnd给的是NULL;
    无界面环境, main(),只为测试这个函数."工具.txt"
    的问题确实出现过..但出现了2,3次后再也没出现了.
    而且那次出现的时候我根据长度在后面多加了个'\0',就好了,
    当时觉得好象是那么回事,可我又把'\0'改成'\r' ,
    还是成功...貌似好了一次 就好了. 晕..
    我又专门再设置成只有一个'\0'
    但都一直很正常了,除非我把正常字符串末尾的'\0'去掉外,
    再也没出现LZ说的情况.文件夹的情况测试过两次,很正常.
    LZ,也许是因为字符串的原因吧.或者就不用C++的 String类看看
      

  4.   

    op.pFrom op.pTo必须以\0结束
    ,  但是stringa类型的变量不也是以\0结束的吗?
    而且如果要名字(不管是英文还是汉字或是数字)是单数的话,就不会出错,肯定是转换的时候出现的问题,现在就像知道,为什么转换出现了问题!
      

  5.   

    我在WinCE下 有时也会出现无法复制的情况...很奇怪的说
      

  6.   

    在 From, TO 对于应的字符串上都加上  #0,问题就解决了