一个关于SHFileOperation()函数的问题!!一定给分!!!

baozhi 2003-01-05 07:22:22
代码如下:
char *From = "C:\\*.TXT\0";
char *To = "C:\\WINDOWS\\TEMP\0";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle;
op.wFunc = FO_COPY;
op.pFrom = From;
op.pTo = To;
op.fFlags= 0;
SHFileOperation( &op);
这段代码运行起来没问题,问题是结构op中的pFrom与pTo成员的值必须是字符串还是要带'\0'的字符串,我的问题是的Edit1->Text的值是AnsiString类型的再由c_str()函数转为字符串,可是转为的字符串是不带'\0'的字符串,参数pFrom和pTo所要的必须是带'\0'的字符串,如果不带'\0'函数就运行不正常了,这怎么办呀!!!!!!1请写代码
比如源文件路径是Edit1->Text,目标路径是Edit2->Text,我要如何才可以把这两个AnsiString 类型的值变为带'\0'的字符串呢!
...全文
41 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingfish 2003-01-07
  • 打赏
  • 举报
回复
试了试,没发现你说的问题


void __fastcall TForm1::Button2Click(TObject *Sender)
{
Edit1->Text = "C:\\*.TXT"; //懒的输入,直接这样写了
Edit2->Text = "C:\\test1";

char buf1[256],buf2[256];
memset( buf1,0,sizeof(buf1));
memset( buf2,0,sizeof(buf2));
strcpy( buf1,Edit1->Text.Trim().c_str());
strcpy( buf2,Edit2->Text.Trim().c_str());

SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle;
op.wFunc = FO_COPY;
op.pFrom = buf1;
op.pTo = buf2;
op.fFlags= 0;
SHFileOperation( &op);

}
baozhi 2003-01-07
  • 打赏
  • 举报
回复
唉,结不了呀,上面的我都用了,都不行呀,一运行就说"无法复制 文件,文件系统错误 (1026)"上面的所有方法都有这个错误!

如果用 kingfish(八百里秦川@龙城异客) 的方法一运行到memset(buf,0,sizeof(buf));就出一个内存地址的错,其它的就出现"无法复制 文件,文件系统错误 (1026)"这个错误,

情况是这样的,Form上有Edit1和Edit2两个控件,我要用Edit1输入拷贝文件的源文件路径,Edit2是目标文件,edit1输入c:\windows\*.* Edit2输入c:\temp,目录没问题,很怪很怪,还请各位再劳劳神!!!运行成功后一定给分
mustang_zr 2003-01-07
  • 打赏
  • 举报
回复
还是别用SHFileOperation() 我觉得很不好把握

这是我的代码:
。。。。。。。
AnsiString strTemp = AnsiString(From) + "*.*";
LPWIN32_FIND_DATA lpFindFileData = new(WIN32_FIND_DATA);
HANDLE hFindFile = FindFirstFile(strTemp.c_str(),lpFindFileData);
if(hFindFile != INVALID_HANDLE_VALUE)
{
DeleteFile(AnsiString(From) + AnsiString(lpFindFileData->cFileName));
for(;FindNextFile(hFindFile,lpFindFileData); \
DeleteFile(AnsiString(From) + AnsiString(lpFindFileData->cFileName)))
{
CopyFile((AnsiString(From) + AnsiString(lpFindFileData->cFileName)).c_str(),(AnsiString(To) + AnsiString(lpFindFileData->cFileName)).c_str(), false);
}
FindClose(hFindFile);
}
delete lpFindFileData;
。。。。。
kingfish 2003-01-07
  • 打赏
  • 举报
回复
// 运行到memset(buf,0,sizeof(buf));就出一个内存地址的错

会吗? 不知道你怎么写的
zbc 2003-01-06
  • 打赏
  • 举报
回复
你可以用strcat函数来连接串“\0”即可,代码如下:
strcat(char *dest,"\0");
Taiji02 2003-01-06
  • 打赏
  • 举报
回复
结帐吧!
痞子酷 2003-01-06
  • 打赏
  • 举报
回复
AnsiString From("C:\\*.TXT");
AnsiString To("C:\\WINDOWS\\TEMP)";
SHFILEOPSTRUCT op;
ZeroMemory(&op, sizeof(op));
op.hwnd = Handle;
op.wFunc = FO_COPY;
op.pFrom = (char *)From.c_str();
op.pTo = (char *)To.c_str();
op.fFlags= 0;
SHFileOperation( &op);
kingfish 2003-01-06
  • 打赏
  • 举报
回复
pFrom,pTo要用两个\0\0结束


strcpy(buf,s.c_str());
;之前用memset(buf,0,sizeof(buf));全清0就不用考虑这个问题了
mustang_zr 2003-01-06
  • 打赏
  • 举报
回复
....我的问题是的Edit1->Text的值是AnsiString类型的再由c_str()函数转为字符串,可是转为的字符串是不带'\0'的字符串,....
不对吧 c_str()是转换成C风格的字符串 怎么回不带'\0'呢
这是我的代码:
。。。。。
int iL= Edit1->Text.Length();
char *From = new char[iL +1 ];
strcpy( From,Edit1->Text.c_str());
。。。。。
运行通过
baozhi 2003-01-05
  • 打赏
  • 举报
回复
谢谢了

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧