ファイルのコピーについて。

解決


筑挂Р  2005-03-08 03:39:19  No: 13611

こんばんわ。質問があります。
ファイルのコピーをしようとして、webからサンプルコードを拾って組み込んでみました。下の例は'a.exe'をプログラムファイルのmysoftというディレクトリにコピーしようとしているところなんですが、どこにもコピーされません。
プログラムファイル以外の場所ならば、コピーできるのですが、なぜでしょうか??

var
    FromF,Tof :String;
    PathID: PItemIDList;
    Path : array[0..MAX_PATH] of char;
begin
  FromF := ExtractFilePath( Application.ExeName ) + 'a.exe' + #0;
  SHGetSpecialFolderLocation(Application.Handle, CSIDL_PROGRAMS, PathID);
  SHGetPathFromIDList(PathID, Path);
  ToF := Path + '\mysoft\a.exe';
  CopyFile(PChar(FromF),PChar(ToF),True);

また、不特定なるファイルをコピーしたいんですが、どうすればよいのでしょうか。不特定なるファイルをコピーするとは、例えば、'*.txt'ならば、ディレクトリにあるテキストファイルすべてをコピーするということです('*.*ならすべてのファイル')。やはり、ひとつずつコピーしなくてはならないのでしょうか?
よろしくお願いします。


筑挂Р  2005-03-08 04:06:48  No: 13612

力づくで
ToF := 'C:\ProgramFiles\mysoft\a.exe';
としてやるとProgramFilesにコピーできたんですが。。なんかスマートじゃないですよね。。
関数などを使ってProgramFilesの位置を特定してやりたいのですが。。
また、ディレクトリごとコピーするというのは可能なんでしょうか。
よろしくお願いします。


ふぐちゃん  2005-03-08 04:09:27  No: 13613

> SHGetSpecialFolderLocation(Application.Handle, CSIDL_PROGRAMS, PathID);
CSIDL_PROGRAMS を CSIDL_PROGRAM_FILESに変更してみてください。

それと、PathID はいらなくなったら CoTaskMemFree 等で解放することをおすすめします。

> 不特定なるファイルをコピーしたいんですが、どうすればよいのでしょうか。
> ディレクトリごとコピーするというのは可能なんでしょうか
APIの SHFileOperation をネットで調べてみてください。


筑挂Р  2005-03-08 04:26:51  No: 13614

もちろんSHFileOperationは調べました。
しかし、SHFileOperationではコピー先のファイルの指定でPathを使うと、String型とPcharの互換性がないエラーが起こって使えませんでした。。


ふぐちゃん  2005-03-08 04:32:11  No: 13615

> しかし、SHFileOperationではコピー先のファイルの指定でPathを使うと、String型とPcharの互換性がないエラーが起こって使えませんでした。。
いや、それは SHFileOperation が悪いのではなくて引数の指定方法が間違っているからでしょう。(^_^;)


Mr.XRAY  URL  2005-03-08 04:58:54  No: 13616

直接の回答,方法ではありませんが,アプリを作成していると,ファイルや
フォルダの操作が必要になることが多くあります.

以下のページに参考となるサンプルがあります.一度ご覧なってはいかが
でしょうか.

http://takamichie.at.infoseek.co.jp/warehouse/index.html


ふぐちゃん  2005-03-08 05:02:30  No: 13617

"Program Files"のパスは取得できましたか?


たかみちえ  URL  2005-03-08 05:05:34  No: 13618

> String型とPchar
  ふぐちゃんさんのお話から、考えられたかも知れませんが…。
String型はDelphi専用の形式です。APIを呼び出すときはPCharにキャストしなくてはいけません。
PCharのことは、ヘルプを読めば載っています。


ふぐちゃん  2005-03-08 05:11:12  No: 13619

たかみちえさんが開発されたユニットやコンポも素晴らしいですが、
http://homepage3.nifty.com/m-and-i/tips/tipspage.htm#component
ここの「SHFileOperationコンポーネント」もおすすめです。


筑挂Р  2005-03-08 07:30:52  No: 13620

なんとかSHFileOperationを使って自分でコードを組んでいるんですが。。
Program Filesのパスが取得できません。
しかもこれ、実行してみるとProgramFilesのパスじゃなくて、プログラムのパスみたいでした・・


TexWork  2005-03-09 06:58:44  No: 13621

uses
ShlObj,SHFolder//←この二つを追加しました

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
  private
  function GetDirectory(const DirID: Integer): String;
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;
implementation

{$R *.dfm}

function TForm1.GetDirectory(const DirID: Integer): String;
var
    IDs : PItemIDList;
    buf : array [0..MAX_PATH] of Char;
begin
    SHGetSpecialFolderLocation(0,DirID,IDs);
    SHGetPathFromIDList(IDs,buf);
    Result:=IncludeTrailingBackslash(String(buf));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  label1.Caption:=GetDirectory(CSIDL_PROGRAM_FILES);
end;
end.

  これでどうでしょうか?わたしも、先日フォルダー取得に困ったのですが。Mr.XRAYさんが他のサイトで答えていたのがあったはずです。
実際に私は初心者なので、このコードが正しいのかわかりません。
(先輩方に採点をお願いします。)

尚使用OSはXP-sp2−HomeEdition Delphi6Personalでチェックしました。
  使用コンポーネント
Buttonと、labelをひとつずつ貼り付け
実際にはProgramFilesのパスが表示されるだけです・・・。


これ不要?  2005-03-09 15:29:53  No: 13622

>function TForm1.GetDirectory(const DirID: Integer): String;
>var
>    IDs : PItemIDList;
>    buf : array [0..MAX_PATH] of Char;
>begin
    IDs := CoTaskMemAlloc(Sizeof(PItemIDList));     // これ不要?
>   SHGetSpecialFolderLocation(0, DirID, IDs);
>   SHGetPathFromIDList(IDs,buf);
>   Result:=IncludeTrailingBackslash(String(buf));
    CoTaskMemFree(IDs);                             // これ不要?
>end;


筑挂Р  2005-03-10 02:12:25  No: 13623

TexWorkのコードできちんと表示されました。ありがとうございます(^^)
これ不要?さんのレスもきになりますが・・
あと、IncludeTrailingBackslashはプラットフォームに依存すると警告が出ますが、問題ないのですか??


通りすがり  2005-03-10 03:17:11  No: 13624

>TexWorkのコードできちんと表示されました。ありがとうございます(^^)
よくわかりませんねー。
一番初めのレスで他の人がすでに答えてくれているんじゃないですか。
無視する理由ってあります?

>あと、IncludeTrailingBackslashはプラットフォームに依存すると警告が出ますが、問題ないのですか??
ヘルプに書いてありますよ。


筑挂Р  2005-03-10 23:52:48  No: 13625

自己解決しました。
みなさん、ありがとうございました!


けっきょく  2005-03-10 23:59:13  No: 13626

> 自己解決しました。

全部無視されたのかなぁー


マナー  2005-03-11 00:18:14  No: 13627

なんか後味の悪いスレッド。
すっきりしないな。
マナーって大事だね。


筑挂Р  2005-03-11 00:48:56  No: 13628

無視したつもりはないのですが・・。
ふぐちゃんさんのレスも参考になりました。たかみちえさんのレスも参考になりました。
仕事が終わってまとめてレスを読んだので、TexWorkさんのレスが一番印象がつよくて。。申し訳ないです。
自己解決というのは言い方が悪かったです。
皆さんの助言のおかげで解決できました。


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

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






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