フォルダをコピーするには。

解決


ビギナー  2009-01-16 03:07:48  No: 33145

こんにちは。
いつも参考にさせていただいております。

早速ですがご質問させていただきます。
今、カレントディレクトリ内の、あるフォルダを
異なるドライブにコピーさせるPGを作成しています。

フォルダ一覧が表示され、その内のひとつを選択し、
デバックでコピー元と先の関数の中を調べると、
きちんと思い通りのものが入っています。

ですが、実行すると、
"ファイルをコピーできません。 送り側のファイルまたはディスクから読み取れません"のエラー表示が出てしまいます。

もし、原因や解決方法がお分かりの方は
教えていただけると助かります。

var
 CurDir  : String;      //カレントディレクトリを格納する変数
 SelectFolder: String; //フォルダのパスを格納する変数

 SHFILEOPSTRUCT : TSHFileOpStruct;

begin
  if MessageDlg('コピーを開始しますか?',mtinformation,mbYes,mbNo],0)
=mrYes then
    begin
  
   //カレントディレクトリを取得
   CurDir := GetCurrentDir;
   CurDir := CurDir+ '\フォルダ名';

  //ダイアログボックス表示
  if selectdirectory('フォルダの選択','',SelectFolder) then

   //構造体の初期設定
  With SHFILEOPSTRUCT do
  begin
    wnd    := Handle;
    wFunc  := FO_COPY;
    pFrom  := PChar(CurDir) ;
    pTo    := PChar(SelectFolder);
    fFlags := FOF_MULTIDESTFILES;
 end;

 //実行する
  SHFileOperation(SHFILEOPSTRUCT); 

宜しくお願い致します。


とりあえず  2009-01-16 03:26:38  No: 33146

MessageGlgの位置替えたらコピーできました。
原因や本当の修正方法は他の人にパス・・・

procedure TForm1.Button1Click(Sender: TObject);
var
 CurDir  : String;      //カレントディレクトリを格納する変数
 SelectFolder: String; //フォルダのパスを格納する変数

 SHFILEOPSTRUCT : TSHFileOpStruct;

begin

//  if MessageDlg('コピーを開始しますか?',mtinformation,[mbYes,mbNo],0)
//=mrYes then
//  begin

   //カレントディレクトリを取得
   CurDir := GetCurrentDir;
   CurDir := CurDir+ '\フォルダ名';

  //ダイアログボックス表示
//  if selectdirectory('フォルダの選択','',SelectFolder) then
  SelectFolder := 'c:\test';

  if MessageDlg('コピーを開始しますか?',mtinformation,[mbYes,mbNo],0)
=mrYes then
  begin

   //構造体の初期設定
  With SHFILEOPSTRUCT do
  begin
    wnd    := Handle;
    wFunc  := FO_COPY;
    pFrom  := PChar(CurDir) ;
    pTo    := PChar(SelectFolder);
    fFlags := FOF_MULTIDESTFILES;
   end;

 //実行する
  SHFileOperation(SHFILEOPSTRUCT);

  end;

end;


ttt  2009-01-16 04:18:54  No: 33147

FOF_MULTIDESTFILESはいらないのでは?
これを指定するのは、pTo に#0で区切った名前が複数入っている場合です。
また、pFromも(こちらはフラグに関係なく)複数の名前を含むので、最後が#0#0で終わってないといけませんね。


ビギナー  2009-01-16 04:35:43  No: 33148

みなさん、早速のご返答
本当にありがとうございます。

みなさんのご意見を参考に、
以下のように直したところ、保存されるようには
なったのですが、フォルダ内のファイルだけが
コピーされてしまいます。

CurDir := CurDir+ '\フォルダ名'
が原因なのでしょうか。

繰り返しになってしまい、申し訳ございません、
宜しくお願い致します。

 
//構造体の初期設定
  With SHFILEOPSTRUCT do
  begin
    wnd    := Handle;
    wFunc  := FO_COPY;
    pFrom  := PChar(CurDir + '\*.*'+#0) ;
    pTo    := PChar(SelectFolder + '\'+#0);
    fFlags := FOF_ALLOWUNDO or FOF_FILESONLY;
    fAnyOperationsAborted := False;
    hNameMappings := nil;
    lpszProgressTitle := nil;
 end;

 //実行する
  SHFileOperation(SHFILEOPSTRUCT);


とりあえず  2009-01-16 05:00:17  No: 33149

SHFILEOPSTRUCT.fFlags  を見直してみてはどうでしょう?

参考
ttp://mrxray.on.coocan.jp/Halbow/Chap18.html


ビギナー  2009-01-16 18:30:26  No: 33150

お世話になっております。

とりあえず様がご提示してくださったURLを参考にし、
ttt様がお教えしてくださった通りにしたところ
無事解決いたしました。

 pFrom  := PChar(CurDir + '\*.*'+#0) ;
 pTo    := PChar(SelectFolder + '\'+#0);

を、下記のように変え、フォルダごと他の場所へコピー
することが出来ました。

 pFrom  := PChar(CurDir + #0#0) ;
 pTo    := PChar(SelectFolder + #0#0);

とりあえず様、ttt様、
本当にありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加