SHFileOperation関数の使い方が今ひとつ理解できません。
Button2Click()手続きの中から CopyRootin()手続きを呼び出してファイルをコピーします。これは正常にコピーするのですが、コピー終了後引き続きButton2Click()手続きの中でテキストファイルを移動したいのです。
エラーが出るので、wndを0にしてみたり、handleにしてみたりいろいろするのですがだめです。何がおかしいのかご指導下さいませんか。メモリー解放など必要なのでしょうか。
よろしくお願い致します。
procedure CopyRootin(const CopyFileName: string);//コピールーチン
・・・・
for i := 2 to num do
・・・・
with hSHFileOpStruct do //************* コピーする
begin
wnd := handle;
wFunc := FO_COPY;
pFrom := PChar(FromFile + #0);
pTo := PChar(ToFile + #0);
fFlags := FOF_ALLOWUNDO or FOF_NOCONFIRMMKDIR;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
SHFileOperation(hSHFileOpStruct);//************* コピーする
end;
・・・・・
end;
procedure TfrmMain.Button2Click(Sender: TObject);
・・・・
CopyRootin(frmMain.ListBox1.Items[0]); ←手続き呼び出し
・・・・・
with foStruct do //********************
begin
wnd := 0; ←←← エラーになる
wFunc := FO_MOVE;
pFrom := 'C:\Temp\test.txt' + #0;
pTo := 'C:\aaa\' + #0;
fFlags := FOF_FILESONLY or FOF_ALLOWUNDO;
fAnyOperationsAborted := False;
hNameMappings := nil;
lpszProgressTitle := nil;
end;
SHFileOperation(foStruct); //********************
・・・
end;
> エラーが出るので
エラーメッセージを書かないのは致命的。コードも分かりづらい。
回答しづらい。
非同期で動くはずですので、ファイルコピー完了していないのでしょう。
完了するまで待ってから次の処理をすべきです。
SHFileOperation APIの使い方自体には問題なさそうですので、
にしのさんの言うとおりでしょう。
ファイルの移動、コピーについては、CopyFile、DeleteFile
を使うという選択肢もあります。SHFileOperationのように
Windowsに全部任せてしまう処理ではないので、同期的に
進捗を把握できますので、用途によっては無理にSHFileOperation
を使う必要はないと思います。
新人で、まだ先輩方にどのように説明したらいいのかが解らない次第で、大変ご迷惑をおかけしました。
アドバイスに従い、いろいろ試みましたが、だめでしたので、とりあえず平蔵様のアドバイスでCopyFile、DeleteFileを試みましたところとりあえず目的は達成できました。
できればいいのかもしれませんが、勉強中ですから、この問題にも引き続き挑戦していきます。
もう少し問題を整理してまた質問させてください。
SHFileOperationに関しましては、また教えてください。
助かりました。ありがとうございました。
ツイート | ![]() |