• ベストアンサー

CFからファイルをコピーするプログラムの作り方

マウスで画面上のボタンをワンクリックするだけで、下記の動作を行うプログラムを作成したいのですが、可能でしょうか? もし可能でしたら、作成に役立ちそうな参照URL等を教えていただければと思います。 言語はメジャーなものが好ましく、OSはWindowsXPです。 1.USBポートに挿してあるコンパクトフラッシュ・メモリーカードに保存されている全てのファイルを、別のフォルダにコピーする。 2.コンパクトフラッシュ・メモリーカードに記憶されている保存データを全て削除する。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • fifaile
  • ベストアンサー率25% (622/2403)
回答No.2

バッチファイルでいけると思いますよ。 わざわざGUIアプリにする必要はないでしょう。 ドライブが決まっているのなら、 move 元のドライブ\*.* コピー先フォルダ だけで事足ります。 他に何か条件がなければコレで十分です。

mosa1518
質問者

お礼

回答ありがとうございます。 バッチファイル初めて知りました。 便利ですね。バッチファイルで一度作ってみたいと思ってます。 しかし実は、日付等で判定する処理も必要でして、いろいろ試して 見てもバッチで不可だった場合は別の手段を探します。

その他の回答 (5)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.6

コピー元のドライブレターが決まっているなら、 私もANo.2と同じくバッチファイルで十分だと思います。 ただ、moveのワイルドカード指定だとディレクトリは移動されないみたいなので、 xcopyとrmdirを使うのがよいと思います。 Windowsコマンド集:ITpro http://itpro.nikkeibp.co.jp/free/NT/WinKeyWord/20040805/1/#9

mosa1518
質問者

お礼

回答ありがとうございます。 バッチファイルで一度作ってみたいと思ってます。 コマンド集ありがとうございます。参考にさせて頂きます。 実は、判定文やファイル抽出処理も入れる必要があり、バッチファイル で処理ができない場合は、別の手段を探そうと考えてます。

noname#58606
noname#58606
回答No.5

一応、大仰な事を書いてしまったので。 VBScriptやWSHって手もあると思いますよ。 経験がないので、きちんとできるかは、分からないのですが。^^; http://www.happy2-island.com/vbs/cafe02/capter00209.shtml

mosa1518
質問者

お礼

追加回答ありがとうございます。 VBScript等、使いこなせたら便利そうですね。 MS-DOSバッチで駄目だった場合は参照URLで いろいろ勉強させて頂こうと思います。

回答No.4

http://www.tohoho-web.com/wwwperl.htm ↑とほほのPerl入門 Perlはご存知CGIやコマンドプロンプトで実行できる言語です。私は一番簡単で入門者には一番いい言語のような気がします。 ちなみにPerlができればPHPもできます(似たもの同士です)。 また、プログラム言語というのはどれも似たようなものでPerlでプログラム言語の概念がわかれば他のCやC++,Java、C#などもわかるとおもいます。ではがんばってください。いかにPerlでのソースを載せておきます。Perlをインストールするには「Perl インストール」などでけんさくするとたくさん情報があります。 #次の2行のディレクトリを変えるだけ $from_dir = 'c:\program1\test'; $to_dir = 'c:\program1\test2'; opendir(DIR, "$from_dir"); @filelist=readdir(DIR); foreach $file(@filelist) { if($file eq ".") { next; } if($file eq "..") {next; } system("move \"$from_dir\\$file\" \"$to_dir\\$file\""); } closedir(DIR); 以上がPerlでのソースとなります。また、他の方がおっしゃるとおり、Windows付属のバッチプログラムやVBScriptでやれば何もインストールせずにできます。 私としてはPerlをやると簡単にプログラム言語を覚えられて一石二鳥だとおもったので紹介しました。もしバッチやVBScriptでやるなら検索すると色々情報があります。 ではがんばってください。

mosa1518
質問者

お礼

回答ありがとうございます。 Perlは一度、HP作成でちょこっと使ったのですが、 ほぼ忘れてしまったので、再度勉強したいです。 今回、MS-DOSのバッチを使うことを考えているのですが、条件判定 が上手く処理できなかった場合は、Perlだと判定文等を 追加するのが私には一番やりやすそうなので、その際は 参考にさせて頂きたいと思います。

  • POTATO_XP
  • ベストアンサー率10% (24/230)
回答No.3

うーん、1クリックがどの場面を想定しているかがイマイチなんですが・・・。 以下イメージでいいですか? 対象となるUSBを挿す。それを検知したPCが任意のアプリを起動。CFのフォルダの構成を解析+任意のフォルダにファイル達を移動。 まず、常駐させる必要がある為、常駐させておく最も単純なアプリとファイル操作をするアプリを切り分けましょう。 常駐するアプリには、 1).USB挿入を検知する。 2).自動コピーの対象となるメディアなのか判断する。 3).対象メディアであれば、コピー用のプロセスを起動する。 1)は・・・難しい・・・。ここがコレの山。Windows上でUSBが挿さった  事を通知するメッセージをトリガにしたいが、この辺は詳しくないで  す。ゴメンナサイ。何か他に良い方法あるかもしれません。 2)これは、対象メディアのドライブ直下に情報ファイルを作っておいて  それが存在するかで判断するのが一番単純。全部のUSBに反応しちゃ  困るので、その対策です。  使用するAPIはFindFirstFile 3)それが見つかればコピー用プロセスを起動  使用するAPIはCreateProcess 切り分ける理由は、全てを常駐さすと、プログラムサイズによっては メモリを無駄に消費するアフォなアプリになるからです。ただ、メッ セージのフックもあまりお勧めしません。作りによってはシステムが 重くなる可能性があります。この辺を一番工夫して脳みそコネコネ考 えてみてください。 次に、コピーツールです。 1).プロセスが生成されると同時に例のメディアのドライブ名を貰う。 2).例のドライブ配下のフォルダ構成を解析し、木構造のデータベースにする。ファイルが存在しなければ終了。 3).そのデータベース元にをツリービューに表示するダイアログ出現。 4).移動するファイルにチェックしOKボタンをクリック(キャンセルで終了) 5).Cドライブのどこかにバックアップ用のディレクトリを構成。 6).バックアップディレクトリ内に日付と時刻をディレクトリ名に用いたサブディレクトリを作成。 7).サブディレクトリ内に選択ファイルを移動。その後、終了。 1).どういう事をすればよいかはCreateProcessを勉強すれば自ずと見えてきます。 2).使うAPIはFindFirstFile、FindNextFileとWIN32_FIND_DATA構造体。ミソは*.*や*です。 3).4).は単なる装飾です興味あれば補足要求してください。 5).6).使うAPIはCreateDirectory 7).使う可能性があるAPIはMoveFile、DeleteFile。2)で作ったデータベースを元にうまいごとやって下さい。 切り分けておけば3).4).の様にイロイロ装飾したとても、常駐時には 影響ありません。また、コピーの作業が短時間で終わらない事を想定 し、5).6).7).は別スレッドで動作させる事が望ましい(Windowを出現 さすなら)。 日付と時刻をディレクトリ名に用いるのにはコピー先の重複を避ける 為の布石です。名前が再度起動した時に重複すると嫌でしょう? 以上です。実際に作ってみてはいませんが、自分ならこう作るなぁと いった感じのアドバイスです。補足要求受け付けます。 以上、参考まで。 ※APIはMSDNで調べてください。すぐ検索に引っ掛ります。 ※VC++、VC#、Boland C++がお勧め。

mosa1518
質問者

お礼

回答ありがとうございます。 説明が不十分でした。申し訳ございません。 常駐が運用上の理由で難しいのでUSBを挿してからアプリを起動するのに1クリック、処理を行なうのに1クリックというのが私のイメージ でした。 いろいろ考慮した結果、まずMS-DOSのバッチで作ってみようと思います。 しかし、コピーするだけといっても、その日の日付でコピー先のフォルダを判定したりする必要があるので、MS-DOSバッチでその様な処理が不可の場合、API等を利用してみようと考えてます。 その際は、再度読み返して参考にさせて頂きたいと思います。

noname#58606
noname#58606
回答No.1

ワンクリックしても、いいのなら、昔ドライブの容量を調べるソフトを作ったことがあるので、それの応用でできるはず。 まず、 aから、zまでループして、あるかどうか判断する。 すげー、原始的。 ld := GetLogicalDrives; for i := 0 to 25 do begin //←この部分  if (ld and (1 shl i)) > 0 then  Memo1.Lines.Add(Char(Ord('A') + i) + ':\'); 配列に入れるなりして、それを。 次ぎに、そのドライブを、ボタンとして表示させる。  まぁ、適応にフォーム作成。 そのボタンを押すと、中身をすべて検索して、移動する。  ファイル・フォルダ移動自体は、どの言語でもできる。 本格的なソフトは、USBをつっこんだ段階で、ソフトを起動して、処理するものもあるけど、まぁ、素人なので、1秒ループで、USBがあったら、処理すれば、ボタンさえ押さなくて、済むかも。 でも、そうなると常駐する必要があるか。 その時は、検索仕切れなかった。 USBは、入れ替えが激しいので、メディアの限定は難しいかな?と思ったけど、「DriveSpec.VolumeSerial:メディアシリアル」で、個別の判定も、なんかできそうだなー。 USB関係のコンポーネントも、いろいろと見つかったし。ほっくほく。 結論として、 【Win32APIが、使える言語なら、どれでもいけるような。】 Delphiは、参考書籍が他のメジャー言語より、少ない点を除けば、難しくはないよ。 Win32APIを使った方が、楽に作れると思うけど、ちとこちらは難しいかも。 でも、そんなに難しくはないよ。 全くの初心者は無理だけど、初級者を抜ければできるはず。 http://homepage1.nifty.com/MADIA/delphi/Win32API/GetDriveType.htm http://mdxonline.dyndns.org/archives/2002/05/delphi_4.shtml http://mdxonline.dyndns.org/archives/old1998/old2002/

mosa1518
質問者

お礼

回答ありがとうございます。 参照URL参考になりました。 常駐は運用規則上、難しいのでUSBを挿してから手動で起動するタイプを目指します。 いろいろ考慮した結果、まずMS-DOSのバッチで作ってみようと思います。 しかし、コピーするだけといっても、その日の日付でコピー先のフォルダを判定したりする必要があるので、MS-DOSバッチでその様な処理が不可の場合、Win32API等を利用してみようと考えてます。

関連するQ&A