こんにちは。
いつも参考にさせていただいております。
早速ですがご質問させていただきます。
今、カレントディレクトリ内の、あるフォルダを
異なるドライブにコピーさせる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);
宜しくお願い致します。
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;
FOF_MULTIDESTFILESはいらないのでは?
これを指定するのは、pTo に#0で区切った名前が複数入っている場合です。
また、pFromも(こちらはフラグに関係なく)複数の名前を含むので、最後が#0#0で終わってないといけませんね。
みなさん、早速のご返答
本当にありがとうございます。
みなさんのご意見を参考に、
以下のように直したところ、保存されるようには
なったのですが、フォルダ内のファイルだけが
コピーされてしまいます。
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);
SHFILEOPSTRUCT.fFlags を見直してみてはどうでしょう?
参考
ttp://mrxray.on.coocan.jp/Halbow/Chap18.html
お世話になっております。
とりあえず様がご提示してくださったURLを参考にし、
ttt様がお教えしてくださった通りにしたところ
無事解決いたしました。
pFrom := PChar(CurDir + '\*.*'+#0) ;
pTo := PChar(SelectFolder + '\'+#0);
を、下記のように変え、フォルダごと他の場所へコピー
することが出来ました。
pFrom := PChar(CurDir + #0#0) ;
pTo := PChar(SelectFolder + #0#0);
とりあえず様、ttt様、
本当にありがとうございました。
ツイート | ![]() |