複数ファイルのZip化について

いつもお世話になっております。
フォルダの中に入っている複数のエクセルファイルをZip化しようとしています。しかし、Zipファイルが10Mを超えるとファイルを半分ごとにZip化する掟があります。

方法はありますでしょうか?
ご教授お願いいたします。

@Yuu

実際にやったことは無いですが、以下ロジックでできる気がします。

  1. 個々のファイルサイズを取る。(参考: Calculate Size of a particular file)
  2. 各ファイルごとにループし、ファイルサイズが10 MBを超えるまで足し合わせ、zip 用のグループを作る。(ファイルを移動してzip用のフォルダに移すなど)
  3. 個々のグループをzip化する。
    ※ただし1ファイルで10MBを超える場合があるのであれば、例外として処理する必要があります。

ご参考まで

私も実際にやったことは無いですが、以下ロジックを考えてみました。

  1. 個々のファイルサイズを取る。(参考: Calculate Size of a particular file)
  2. 個々のファイルサイズを合算する(全体サイズとする)
  3. 全ファイル、ループ
    1)ファイルサイズが5 MBを超えるまでzip 用のグループを作る。(ファイルを移動してzip用のフォルダに移すなど)
    2)全体サイズ - zip 用のグループのファイルサイズ > 5MBなら次のZIP用のグループを作る(10MBを超えたら5MBでファイルを半分ごとにZIPさせるため)。
  4. ループ抜けたら、をzip化する。

1ファイルで10MBを超えることがあるのか(以下ロジックでは未考慮)。
トータルで20MB以上のZipファイルになることがあるのか(加味してロジックを書いておくのか←Better)。
ファイルの組み換えをしたら2ファイルのZipに収まるけど、そこまで考慮するのか。
などにもよりますね(後者は面倒なロジックになるので考慮しないのをお勧めします)。

ラフにロジックを考えると

  1. 対象ファイルをループ(1ファイル以上存在することとする)
    1-1. 添付.zipに対象ファイルを追加圧縮(既存Zipファイルに追加可能かは未確認。できなければ対象分すべてを新規圧縮)。
    1-2. 添付.zipのサイズ<10MBの場合。
    A. 添付.zipを添付bak.zipにコピー(上書き)。
    1-3. 上記以外(添付.zipのサイズ≧10MB)の場合。
    A. 添付bak.zipを添付1.zipにリネーム(上書き)。(1は以降連番とする)
    B. Listコレクションに "添付1.zip"を追加。
    C. 対象ファイルを添付.zipに新規圧縮。
  2. 添付.zipを添付n.zipにリネーム(上書き)。(nは以降の連番)
  3. Listコレクションに "添付n.zip"を追加。
  4. Listコレクション分を添付。

厳密には必要な処理が所々抜けていたり、処理を分解記述する必要があるかもしれません。

HANACCHIさん

いつもお世話になっております。
ファイルを半々にして(必ず偶数である)、Zip用のフォルダ二個の中(新規作成しました)に入れたいのですか、もしよかったらご教授お願いいたします。

ご返事ありがとうございました。

こちらのやり方で試してみます。

ご返事ありがとうございます。

説明不足で申し訳ありません、ファイル一個のサイズはおよそ403KBです。

@yuu
ありゃっ!? 半分にするのを忘れたり、メール添付なんて無いのに・・・
ネットとリアルを混ぜてしまっていました。
(疲れてるのかな・・・、私の投稿は無視してください。参考用に先の投稿は残しておきます)
申し訳ありません。

ファイルの一覧を取得します。
それをdatatable化します
サイズを格納すら列を追加します
そこにdatatable上のファイル名から取得したサイズを格納します
サイズ順で並び替えします

datatableの行数の半分までループさせ、
最小行と最大行のファイルをフォルダAにコピー
次は最小行+1と、最大行−1をフォルダAにコピー
これをコピーしたファイルのサイズ合計が閾値を超える手前まで繰り返す

コピーしていない残りのファイルをフォルダBにコピー

フォルダAを圧縮
フォルダBを圧縮

どうでしょう!?