請問有關於 SHFileOperation 的錯誤 |
答題得分者是:deity
|
jtain
一般會員 發表:16 回覆:18 積分:6 註冊:2005-01-03 發送簡訊給我 |
我的程式如下,在相同的參數執行時,有時候正常工作
但有時候會出現『無法複製檔案 : 檔案系統錯誤(1026)』
這是怎麼一回事? void __fastcall MySaveFile(char *s, char *z){
SHFILEOPSTRUCT oFile; ZeroMemory(&oFile, sizeof(SHFILEOPSTRUCT));
oFile.lpszProgressTitle="檔案複製中...";
oFile.hwnd=Form1->Handle;
oFile.wFunc=FO_COPY;
oFile.pFrom=s;//s.c_str();
oFile.pTo=z;//z.c_str();
oFile.fFlags= FOF_FILESONLY;
SHFileOperation(&oFile);
} 無所不在
------
無所不在 |
g6101
高階會員 發表:22 回覆:129 積分:110 註冊:2002-06-15 發送簡訊給我 |
jtain您好:
請參考本站的連結http://delphi.ktop.com.tw/topic.php?topic_id=48506,站上還有更多,自己搜尋一下
|
deity
尊榮會員 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
您好:
我想是因为oFile.pFrom 和 oFile.pTo 实际上是“多个null结束的字符串”,可以带多个文件名同时做。
比如: 'f1.txt'#0'f2.txt'#0'f3.txt'#0#0 可以同时做 f1.txt和f2.txt和f3.txt
3个文件, 最后要多一个0表示全部结束了
参考下列两种做法,试试看:
方式一: var OpStruc: tSHFileOpStruct; frombuf, tobuf: Array [0..128] of Char; begin FillChar( frombuf, Sizeof(frombuf), 0 ); FillChar( tobuf, Sizeof(tobuf), 0 ); StrPCopy( frombuf, 'g:\ado\*.exe' ); StrPCopy( tobuf, 'g:\asp' ); With OpStruc DO Begin Wnd:= Handle; wFunc:= FO_COPY; pFrom:= @frombuf; pTo:=@tobuf; fFlags:= FOF_NOCONFIRMATION or FOF_RENAMEONCOLLISION; fAnyOperationsAborted:= False; hNameMappings:= Nil; lpszProgressTitle:= Nil; end; ShFileOperation( OpStruc ); end; 方式二: function CopyFile(SourceName,TargetName:String):Boolean; var F:TShFileOpStruct; begin F.wnd:=InputForm.Handle; F.wFunc:=FO_COPY; {操作方式} F.pFrom:=PChar(SourceName #0#0); F.pTo:=PChar(TargetName #0#0); F.fFlags:=FOF_ALLOWUNDO OR FOF_RENAMEONCOLLISION; result:= ShFileOperation(F)=0; end;小弟略懂delphi,对BCB不熟< >麻烦您自行修改~< > ~~~静心养德~~~ |
jtain
一般會員 發表:16 回覆:18 積分:6 註冊:2005-01-03 發送簡訊給我 |
我剛發現偶而還是會發生 1026 的錯誤
而且在特定的環境下複製某些檔則一定會有 1026 這個錯誤] 我的程式修改如下
void __fastcall MySaveFile(char *s, char *z){
SHFILEOPSTRUCT oFile;
AnsiString ErrS;
int ErrCode; ZeroMemory(&oFile, sizeof(SHFILEOPSTRUCT));
oFile.lpszProgressTitle="檔案複製中...";
oFile.hwnd=Form1->Handle;
oFile.wFunc=FO_COPY;
oFile.pFrom=s;
oFile.pTo=z;
oFile.fFlags= FOF_WANTNUKEWARNING;//FOF_FILESONLY | FOF_NOERRORUI;//FOF_NOERRORUI=不顯示錯誤視窗
ErrCode=SHFileOperation(&oFile);
if(ErrCode!=NULL){
if(ErrCode!=7){
ErrS.cat_printf("Error Code %d\n%s\n%s",ErrCode,s,z);
MessageBox(NULL,ErrS.c_str(),"錯誤訊息",MB_OK);
}
}
} void __fastcall TForm1::ImgBtn4Click(TObject *Sender){
SaveDialog1->FileName=FileName[0+PageCnt]+".mp3";
if(SaveDialog1->Execute()){
AnsiString s;
AnsiString z;
AnsiString NewFileName = ExtractFilePath(Application->ExeName);
s.sprintf("%s\x00\x00\x00",NewFileName+"英語會話課程\\MP3\\"+FileName[0+PageCnt]+".mp3");
z.sprintf("%s\x00\x00\x00",SaveDialog1->FileName);
MySaveFile(s.c_str(),z.c_str());
}
}
無所不在 發表人 - jtain 於 2005/01/12 14:54:40 發表人 - jtain 於 2005/01/12 15:09:28
------
無所不在 |
cogi698
一般會員 發表:2 回覆:3 積分:1 註冊:2004-07-27 發送簡訊給我 |
你應該沒有按照上面那位大大的範例去改吧!
試著加入下面紅色的部份:
void __fastcall MySaveFile(char *s, char *z){ SHFILEOPSTRUCT oFile; z=z '\0'; s=s '\0'; ZeroMemory(&oFile, sizeof(SHFILEOPSTRUCT)); oFile.lpszProgressTitle="檔案複製中..."; oFile.hwnd=Form1->Handle; oFile.wFunc=FO_COPY; oFile.pFrom=s;//s.c_str(); oFile.pTo=z;//s.c_str(); oFile.fFlags= FOF_FILESONLY; SHFileOperation(&oFile); } |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |