2015年11月5日木曜日

PC フォルダ構造のみをコピー

余り、出番があるとは思えませんが ... 。
ある フォルダ 以下に構築された フォルダ構造(フォルダ ツリー) を別のフォルダの配下として 複製 したい事があります。
数が少なければ、手動でコツコツと手入力すれば おしまい ですが ... 。
間違いを避けたり、正確さを求める場合には こんな方法もあります。


具体的にご説明する前に、どんな状況か お話して置きましょうか。

例えば、あるソフト(以下、親ソフト)が管理するフォルダに 独自の機能を盛り込みたいとします。
充分に、そのソフトの仕組みが理解出来ていれば、 直接、そのフォルダに手を入れる事も可能ではあります。
しかし、今度は、パフォーマンスの問題が生じたり、 今後の親ソフトのアップデートで弊害が生じる恐れもあります。
対応策の ひとつ は、 独自なフォルダ構造を別の場所に複製構築し、そこにアクセスする事です。
こうする事で、 親ソフトは 今迄の様に稼動し、 独自機能は 親ソフトに干渉する事がなくなります。



さて、前置きはこれ位で。

手順を書きます。

使うのは コマンドプロンプト の Robocopy です。

親ソフトの基点フォルダを SourceDir 拡張機能の基点フォルダを ExtensionDir とした場合のコマンドは。

Robocopy SourceDir ExtensionDir /S /Dcopy:T /XF:*.*

    注: 最下をご覧下さい。

これで、ファイル群はコピーされないけれど フォルダ群はコピーされて、 日付情報もそのまま な フォルダ ツリー が出現します。
尚、上の例では、ファイルの無い 空フォルダ は 複製されません。 .

親ソフトでの追加に対しては、 何時も、このコマンドを 内容固定で 実行すれば良い事になります。


ここで、留意点を ひとつ。
Robocopy は 親ソフトが 名前更新した フォルダ を検知出来ない事です。
変更後のフォルダそのものは 問題無く 複製されます。  しかし、
変更前の名前の 独自機能でのフォルダに収められていたデータは 新しい名称のフォルダに複製出来ません。
ですから、この様な用途では、 削除も反映してしまう Mirror オプションは、危険でもあります。.


親ソフトに 更新の通知機能が無い以上、 何か方法を模索しなくては。

  考えられる手段のひとつに ファイルシステムの監視機能がありますが、 大袈裟ですね。
  用途や頻度や要求精度によっては、これを検討する事になりそうです。
  でも、通常は、 いつ変更が行われるか分らないので、常時監視の状態 が発生しますから、 う~ん、悩ましい。
  面倒ですが、 ファイル監視で通知機能を持つサービスを作り、これを親ソフトの起動をトリガとするタスクで登録でしょうか。
  はたまた、 System.IO.FileSystemWatcher クラスを使ったアプリを書くのでしょうか。
  やはり、... 億劫 ... 。
     そして、何度も 変更を繰り返す可能性があるとしたら、 ... 。
     変更してから元の名称に戻しても 変更があった事になってしまっては 困りますし。  う~ん。

  簡単明快なのは、 ある時点に、 ふたつのフォルダからサブ以下を列挙させて、比較する方法でしょうか。
  プログラミング言語であれば、 コレクション等の差分を作る メソッド がありますので、これを利用する事になるのでしょうか。
  即応性が必要無く、ある時点での比較で済むのなら、 この様な 方法 も考えられますね。

いずれにしても、 これらの対応は 簡単にはいかない です。  様々なケースが想定されますので。
ファイルシステムが 綿密に絡むアプリや パソコン設定は なかなか 難しいです。



<注記> 2020/10/29 加筆

現行 Windows 10 v2004 では上記コマンドは機能しません。
代わりに、こちらを。    参考 URL https://shiroyuki-mot-says.blogspot.com/2020/11/pc-robocopy-folder-only-2.html
Robocopy SourceDir ExtensionDir /E /Dcopy:T /XF *.*



[2020/11/04] 加筆にリンクを追記

0 件のコメント:

コメントを投稿