编了一个拷贝文件以及文件夹的小程序(编译环境: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:\\";
}
//---------------------------------------------------------------------------
想请大家帮帮忙,解决一下这个莫明其妙的问题,多谢了!
结果发现了一个近乎神经病的问题比如:原文件的路径是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:\\";
}
//---------------------------------------------------------------------------
想请大家帮帮忙,解决一下这个莫明其妙的问题,多谢了!
解决方案 »
- atl 可不可以实现可视化的com组件
- 内行来,DYNAMIC_DOWNCAST STATIC_DOWNCAST CONTAINING_RECORD三个宏的 功能有什么区别???
- 新手如何选择(VC和java孰优孰劣)
- !!!大家来写个算法玩玩,高分送!!!
- DLL
- 如何用VC来画座标图,望众高手献艺
- 超级高手请进:如何讲Acess数据库中的一个表写到一个EXCEL文件中,除了ODBC外还有什么办法
- 请问哪个api函数可以返回光盘的盘符?谢谢~~~
- 请问在msdn的什么地方可以查到windows消息参数的含义
- 如何动态的组成工具条或者控制板???
- 来者有分!!!!!!!!!!!!!!
- VC读取Access位图问题
那个Edit2->Text="c:\\";指示的是目标地址,但是现在有问题的是源地址
LZ 专研问题精神真是让我佩服..
也许LS所说吧, UP.
使用char from[20];char to[20]; hWnd给的是NULL;
无界面环境, main(),只为测试这个函数."工具.txt"
的问题确实出现过..但出现了2,3次后再也没出现了.
而且那次出现的时候我根据长度在后面多加了个'\0',就好了,
当时觉得好象是那么回事,可我又把'\0'改成'\r' ,
还是成功...貌似好了一次 就好了. 晕..
我又专门再设置成只有一个'\0'
但都一直很正常了,除非我把正常字符串末尾的'\0'去掉外,
再也没出现LZ说的情况.文件夹的情况测试过两次,很正常.
LZ,也许是因为字符串的原因吧.或者就不用C++的 String类看看
, 但是stringa类型的变量不也是以\0结束的吗?
而且如果要名字(不管是英文还是汉字或是数字)是单数的话,就不会出错,肯定是转换的时候出现的问题,现在就像知道,为什么转换出现了问题!