こんばんわ。質問があります。
ファイルのコピーをしようとして、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'ならば、ディレクトリにあるテキストファイルすべてをコピーするということです('*.*ならすべてのファイル')。やはり、ひとつずつコピーしなくてはならないのでしょうか?
よろしくお願いします。
力づくで
ToF := 'C:\ProgramFiles\mysoft\a.exe';
としてやるとProgramFilesにコピーできたんですが。。なんかスマートじゃないですよね。。
関数などを使ってProgramFilesの位置を特定してやりたいのですが。。
また、ディレクトリごとコピーするというのは可能なんでしょうか。
よろしくお願いします。
> SHGetSpecialFolderLocation(Application.Handle, CSIDL_PROGRAMS, PathID);
CSIDL_PROGRAMS を CSIDL_PROGRAM_FILESに変更してみてください。
それと、PathID はいらなくなったら CoTaskMemFree 等で解放することをおすすめします。
> 不特定なるファイルをコピーしたいんですが、どうすればよいのでしょうか。
> ディレクトリごとコピーするというのは可能なんでしょうか
APIの SHFileOperation をネットで調べてみてください。
もちろんSHFileOperationは調べました。
しかし、SHFileOperationではコピー先のファイルの指定でPathを使うと、String型とPcharの互換性がないエラーが起こって使えませんでした。。
> しかし、SHFileOperationではコピー先のファイルの指定でPathを使うと、String型とPcharの互換性がないエラーが起こって使えませんでした。。
いや、それは SHFileOperation が悪いのではなくて引数の指定方法が間違っているからでしょう。(^_^;)
直接の回答,方法ではありませんが,アプリを作成していると,ファイルや
フォルダの操作が必要になることが多くあります.
以下のページに参考となるサンプルがあります.一度ご覧なってはいかが
でしょうか.
http://takamichie.at.infoseek.co.jp/warehouse/index.html
"Program Files"のパスは取得できましたか?
> String型とPchar
ふぐちゃんさんのお話から、考えられたかも知れませんが…。
String型はDelphi専用の形式です。APIを呼び出すときはPCharにキャストしなくてはいけません。
PCharのことは、ヘルプを読めば載っています。
たかみちえさんが開発されたユニットやコンポも素晴らしいですが、
http://homepage3.nifty.com/m-and-i/tips/tipspage.htm#component
ここの「SHFileOperationコンポーネント」もおすすめです。
なんとかSHFileOperationを使って自分でコードを組んでいるんですが。。
Program Filesのパスが取得できません。
しかもこれ、実行してみるとProgramFilesのパスじゃなくて、プログラムのパスみたいでした・・
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のパスが表示されるだけです・・・。
>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;
TexWorkのコードできちんと表示されました。ありがとうございます(^^)
これ不要?さんのレスもきになりますが・・
あと、IncludeTrailingBackslashはプラットフォームに依存すると警告が出ますが、問題ないのですか??
>TexWorkのコードできちんと表示されました。ありがとうございます(^^)
よくわかりませんねー。
一番初めのレスで他の人がすでに答えてくれているんじゃないですか。
無視する理由ってあります?
>あと、IncludeTrailingBackslashはプラットフォームに依存すると警告が出ますが、問題ないのですか??
ヘルプに書いてありますよ。
自己解決しました。
みなさん、ありがとうございました!
> 自己解決しました。
全部無視されたのかなぁー
なんか後味の悪いスレッド。
すっきりしないな。
マナーって大事だね。
無視したつもりはないのですが・・。
ふぐちゃんさんのレスも参考になりました。たかみちえさんのレスも参考になりました。
仕事が終わってまとめてレスを読んだので、TexWorkさんのレスが一番印象がつよくて。。申し訳ないです。
自己解決というのは言い方が悪かったです。
皆さんの助言のおかげで解決できました。
ツイート | ![]() |