« MiCapture Lite ver1.0 | トップページ | MiGrep2がVectorの6月度ランキングに入りました »

2017.07.04

送るメニューにフォルダへのコピーを追加する

プログラムを開発している中で本格的に動作を確認したいときに、そのプログラムをインストールしてあるフォルダにコピーしているのですが、作成した実行ファイルを開発用のフォルダでコピーしてインストールフォルダに貼り付ける操作が面倒なため、エクスプローラの「送る」メニューに追加する「フォルダにコピー」プログラムを作成して使用しています。取るに足らないものですが、一度コピーしたフォルダを履歴として記録して選択できるため一部の方には便利かも知れませんので、先出のMiCapture Liteに引き続いて公開します。

プログラムの内容は非常にシンプルなものですが、プログラムをインストールするProgram FilesもしくはProgram Files(x86)フォルダにファイルをコピーするためには、通常は管理者権限への昇格が必要だと思います。そのため、コピーするファイルもしくはフォルダをコピーして失敗した場合は、コピー用のサブ実行ファイル(ファイルサイズを小さくしたいためコンソールアプリケーションにしましたが、それでも962kb・・・)を監視者昇格モードで起動してコピーするようにしています。

送るメニュー
Filessenndto

ファイルをコピーを起動
Filessendto



// 管理者権限で外部アプリを呼ぶ
// 参照元:KINOさんのflow of water http://fow.minim.ne.jp/blog/?p=88
function RunAsAdmin(hParent: HWND; const ExeFileName, Param: string): Boolean;
var
sei: TShellExecuteInfoW;
begin
FillChar(sei, SizeOf(sei), 0);
sei.cbSize := SizeOf(sei);
sei.Wnd := hParent;
sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI;
sei.lpVerb := 'runas';
sei.lpFile := PChar(ExeFileName);
sei.nShow := SW_SHOWNORMAL;
sei.lpParameters := PChar(Param);
Result := ShellExecuteEx(@sei);
end;

procedure TForm1.CopyFiles(DstFolder: string);
var
srcfile, dstfile, fname, folder: string;
i: integer;
begin
folder := DstFolder;
for i := 1 to ParamCount do
begin
srcfile := ParamStr(i);
if TDirectory.Exists(srcfile, False) then
begin
fname := srcfile + '.$$$';
fname := ExtractFileName(fname);
fname := ChangeFileExt(fname, '');
dstfile := folder + '\' + fname;
try
TDirectory.Copy(srcfile, dstfile);
// Copyに失敗したら相手先フォルダ書き込みにAdmin権限が必要と判断して
// RunAsAdminでコピー用のコンソールアプリAdminCopy.exeを呼ぶ
except
RunAsAdmin(Handle, '.\AdminCopy.exe', '/D "' + srcfile + '" "' + dstfile + '"');
end;
end else begin
fname := ExtractFIleName(srcfile);
dstfile := folder + '\' + fname;
try
TFile.Copy(srcfile, dstfile, True);
// Copyに失敗したら相手先フォルダ書き込みにAdmin権限が必要と判断して
// RunAsAdminでコピー用のコンソールアプリAdminCopy.exeを呼ぶ
except
RunAsAdmin(Handle, '.\AdminCopy.exe', '/F "' + srcfile + '" "' + dstfile + '"');
end;
end;
end;
if IsShowResult.Checked then
MessageDlg(DstFolder +'に'+#13#10 + IntToStr(ParamCount)
+ ' 個のファイルまたたフォルダをコピーしました.',
mtInformation, [mbOK], 0);
Close;
end;


AdminCopy.exeのプロジェクト

program AdminCopy;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils,
System.IOUtils;

var
Mode, Src, Dst: string;

begin
try
if ParamCount < 3 then
Exit
else begin
Mode := ParamStr(1);
Src := ParamStr(2);
Dst := ParamStr(3);
if Mode = '/D' then
TDirectory.Copy(Src, Dst)
else
TFile.Copy(Src, Dst, True);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.

また、セットアッププログラムの作成にはInno Setup + Setup Scriptを使用しています。実行ファイル本体はインストールフォルダにコピーして、「送る」フォルダにショートカットを作成することが出来ますのでとても便利です。
公開ファイルにはセットアップファイルと、Inno setup scriptプロジェクトファイルを含むソースファイルを同梱しました。

「fssetup.zip」をダウンロード

|

« MiCapture Lite ver1.0 | トップページ | MiGrep2がVectorの6月度ランキングに入りました »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/22406/65491749

この記事へのトラックバック一覧です: 送るメニューにフォルダへのコピーを追加する:

« MiCapture Lite ver1.0 | トップページ | MiGrep2がVectorの6月度ランキングに入りました »