サイトアイコン CAD日記

コピー元でzip圧縮後にネットワーク越しにファイルコピーしてコピー先で解凍するのを自動化できないか

コピー元でzip圧縮後にネットワーク越しにファイルコピーしてコピー先で解凍するのを自動化できないか。。とここ数日考えていた。そんなことをしたい理由と要件をはっきりさせておく。

対象のファイルやフォルダがデカいというのがポイント。数十~数百GBになる。Hyper-Vの仮想マシンのvhdxやavhdxはそのくらいの容量になるもので、Hyper-Vホスト間で移動したいということがある。そのくらいのサイズになると一晩コピー処理させておかないと終わらないし、ヘタすると週末ずっと動かしておく必要がある。昼間にそんな巨大なデータをコピーしているとネットワーク回線に負荷がかかって、ネットワーク全体の処理が低速化するはずで、社内の怖い人に怒られる恐れがある。圧縮することで少しでも小さくして、コピーする処理時間を減らしてやりたいということ。また、細切れの小さいファイルをコピーしたいということもあって、VisualSoruceSafeのデータがそれにあたる。小さいファイルを大量にコピーしようとするとやけに時間がかかるということは、やったことある人ならよくわかるだろう。

zipファイルのサイズ上限は4GBなんて言われているが、それはOS標準の機能や少し前のソフトの制限。7zipの64bit版であれば制限はない模様。圧縮前で240GBのファイルで、圧縮と解凍ができることは確認済み。どうせ7zipを使うのであれば、圧縮率の高い7zを使ってもいいだろう。
①コピー元でzip圧縮 ②zipをネットワーク越しにコピーする ③コピー先で解凍する という3つのステップを行うわけだが、これを手動でやると数時間おきに操作をしなければいけない。処理が終わったというタイミングに気付かなければ時間の無駄だし、裏で動かしておいていつ終わるかとちょこちょこと見なければいけないのは気が散る。処理開始させたら、あとはずーっとやらせておいて、最後に結果を出すというのがよい。

以下で要件をまとめてみる。
1.コピー元のファイル(またはフォルダ)を指定する
2.コピー先のフォルダを指定する
3.1で指定したファイルのサイズを取得する
4.2で指定したフォルダの空き容量を取得する
5.3のサイズが4のサイズ以上ならエラー
6.1で指定したファイルを圧縮する
7.6で圧縮したファイルを2で指定したフォルダに移動する
8.7で移動したファイルをその場で解凍する
9.8で解凍したファイルサイズと2のサイズが同じでないならエラー
10.7で移動した圧縮ファイルを削除する
エラー処理まで含めると結構な手数になる。

理想で言えば、Shell(エクスプローラ)を拡張して「圧縮貼り付け」なるメニューを追加すればいいのだが、Shellの拡張自体がハードル高そうなので、C#のフォームアプリで作るのがいいだろう。C#(つまり.NETアプリ)ならばzip圧縮が自前で行えるらしいけど、ファイルサイズの上限が気になる。4GB超えは無理そうだ。よって、7zipをコマンドラインで呼び出すというのが得策だ。以下のように単純な呼び出しでzip圧縮ができる。7z.exe a 圧縮結果.zip 圧縮対象
C#で誰でも使える状態にするのもいいけど、PowerShellで処理を書き込んでしまうのもいいかも。なんて言ってるおいらがPowerShellをよく知らんので、そこから勉強しなきゃいかんからちょいとメンドウ。

こういうアプリってありそうだと思ってググってみたがなかった。探し方が悪いのかもしれない。いや、こういう要件が一般的でないというだけか。でも、潜在的なニーズはあるような気がするので、まともなものができたらフリーソフトで公開してみるのもよいだろう。ニッチな要求だとしても、そこそこのダウンロードがされるんじゃないか。

モバイルバージョンを終了