CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

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

投稿日:2019年8月25日 更新日:

コピー元で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をよく知らんので、そこから勉強しなきゃいかんからちょいとメンドウ。

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

-ソフト開発

執筆者:


  1. sugi より:

    はじめまして、お邪魔いたします。
    ファイルを圧縮してコピーしたほうが速いのか?ということを検索していて、こちらにたどり着きました。
    同じく検索で見つけたのですが、「小さいファイルを大量にコピーしようとするとやけに時間がかかる」を回避するソフトとして、「FastCopy」というものがあるそうですよ。
    圧縮してくれるわけではなさそうなのですが、「可能な限り大きな単位で Read/Write する」そうです。
    com様の要件のように数百GBとなると、圧縮したほうが早いかもしれませんが…。

    お邪魔いたしました。

    • com より:

      なるほど、FastCopyチェックしときます。ネットワーク回線が遅ければ遅いほど、圧縮した方が早いんですよね。帯域を長く使うとメモリみんなに迷惑かかりますし。情報ありがとうございました。

comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

no image

VC6デバッグ

ここ数年抱えていた問題が一つ解決したので、ここに記しておこう。 VC6でデバッグしていると、たまに戻ってこないことがあったのさ。 別の言い方をすると、固まる、凍る、フリーズ、ハングアップ。 マウスは動 …

マルチスレッドプログラミング(C++編)

マルチスレッドプログラミング(VB.net編) マルチスレッドプログラミング(C#編) もあるので、ご覧あれ。 5秒以上の時間を要する処理をやらせていると応答なしになってかっこ悪い、なんてことをアラフ …

no image

通常使うプリンタを取得する

通常使うプリンターを取得する方法をいくつか挙げる。 ①GetDefaultPrinter TCHAR printerName[1024]; DWORD dwBufferSize = 1024; BOO …

no image

レイヤ付きPDFを出力する弊害

Illustratorという高価なアプリを使ってPDFを出力すると、PDFにレイヤが付いてしまって非表示にしたはずのレイヤが表示されて困ったなという事象に2回遭遇したので以下に記録。共通しているのが、 …

PDFアレコレVer1系は1.02で打ち止めとするにあたって最後の強化をした

iTextSharp7を組み込んでVer2にしようというプランに移行するにあたって、心残りだったところをVer1.02として強化しておいた。