質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.62%

ZIPファイルの破損が発生する原因は?

受付中

回答 5

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 17K+

sassan

score 4

VC++で、所定のフォルダにあるテキストファイルをフォルダごとZIP圧縮し、FTPにて別PCへ転送し、転送先のPCで、ZIPファイルを解凍するシステムを作っています。
システム運用中に、ZIPファイルの破損が発生し、転送先PCでの解凍に失敗する現象が発生しました。
ZIPの圧縮・解凍はDLLを使用しており、破損の原因がDLLなのか、通信なのか不明な状態のため、原因を特定したいと考えています。

破損したZIPファイルは、基本的には解凍ができず、トライした中では、Lhaplusのみ破損を検知した上で解凍が実行できましたが、解凍されたファイルは一部のみとなっていました。

また、ZIPファイルをバイナリエディタで確認したところ、ファイル内の途中から複数個所で、512バイト分0埋めデータとなっていました。

上記の状況が発生する原因としては、どのようなことが考えられますでしょうか?

原因特定のために、アプローチすべきこともありましたら、ご教示ください。

<補足情報>
OS:圧縮側:Windows8.1 64bit
OS:解凍側:Windows7 32bit
開発環境:VS2012、VC++
圧縮ライブラリ:zip32.dll、zip32j.dll
解凍ライブラリ:unzip32.dll

<追加情報1>
ZIPファイルは送信後、削除されるため、送信側で破損していたかどうかはわかりません。
DLLでの圧縮時にエラーが発生したかどうかのログも出力していないプログラムのため、現状送信先に破損したZIPファイルが転送された事実しかわかっておりません。

<追加情報2>
DLLでの圧縮は、zip32.dllのZip関数に、以下のようなコマンドを渡しています。
「-rq [出力するZIPファイルパス] [フォルダパス] [フォルダ]\*.*」
通信に関しては、ソースコードがどうなっているか確認できない状況です。

<追加情報3>
システムは、半年ほど稼働しており、送信は1日1回程度ですが、送信側のPCは、数十台あります。
その中で、今回一度だけ発生した現象となります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+1

こんにちは。

破損したZIPファイル

送信側PCのこれに対応するZIPファイルは破損してないでしょうか?
もし、破損していないのであれば通信で破損したことは確定と思います。dllではなくftp通信部分を疑いましょう。

送信側PCのZIPファイルも破損していて受信側の破損したZIPファイルと一致するようならば圧縮時に破損しています。圧縮プログラムに何か問題がないか確認しましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/09 15:04

    ご回答ありがとうございます。
    ZIPファイルは送信後、削除されるため、送信側で破損していたかどうかはわかりません。
    DLLでの圧縮時にエラーが発生したかどうかのログも出力していないプログラムのため、現状送信先に破損したZIPファイルが転送された事実しかわかっておりません。

    キャンセル

  • 2016/08/09 15:29

    なるほど。手がかりが512バイト単位で化けることしかないのですね。

    HDDのセクタは通常は512バイト単位でリード/ライトします。しかし、HDDの故障ならば他にも不具合が出る筈ですので可能性は低いと思います。

    ZIP圧縮が512バイト単位で書き込むとか、FTPが512バイト単位で転送する等の情報があればヒントになりそうですが、私はその辺詳しくありません。ごめんなさい。

    キャンセル

0

この情報だけでは、単にプログラムにバグがあるのでは?ということしかわからないと思います。
最低限、
・原因が圧縮にあるのか通信時にあるのか?
・圧縮や送信部分のソースの概要
だけでもわからないと何が原因かはわかりようがないと思います。

とはいえ、DLLにバグがあるとは思えません。
圧縮時もしくは通信時のファイルの読み込み時の何等かバグがあるのではと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/09 17:40

    ご回答ありがとうございます。
    <追加情報2>として、不十分ですが、補足させていただきました。
    DLLのバグではないだろうとのことですが、今回の使い方の場合、ファイル破損の結果となる場合は、ありそうでしょうか?

    キャンセル

0

その状況では原因の特定は不可能ですし、復旧も不可能かと思います。
・送信元ファイルがそもそも壊れていた
・どこかで誰かが一部を書き換えた
・ディスク障害
・ネットワーク障害
・プログラムの不具合
・FTP転送中にコケた

最後のFTP転送中にコケた場合、似たような状況になった記憶があります。
FTP転送した際に、送信元と送信先でデータが一致しているかどうかの確認は取っていますか?
ハッシュ値等のファイルも一緒に転送すると、何かあった際の原因の追跡の役に立ちます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/09 18:04

    ご回答ありがとうございます。
    おっしゃるとおり、現状では原因の特定ができないため、可能性を模索している状態です。
    FTP転送中にコケた、というのは、命令は成功したが、実際のデータ転送が正しくいかなかった場合でしょうか?
    今回、FTPの処理部がどのようになっているかわからない状態ですが、エラーのログは記録されていませんでした。

    キャンセル

0

興味深い事象です。半年に1回とのことなので、原因調査も解消も難航するでしょう。同情します。

以下、推測混じりですが、「私だったらこうする」というのを書いてみます。投機的な調査が必要なので覚悟がいります。

まず、足回りの可能性をつぶします。ほかにディスクエラーが出ていないか確認します。
受信したファイルの更新タイムスタンプをみて期待通りか、つまり、全然別の処理が掴んで上書きしてたよーなんてことがないことを確認します。
アンチウィルス系のプロダクトが入っているなら、バグ報告があがってないかなど、ベンダ情報を調査します。

圧縮・展開処理について、バイト列をメモリ上で圧縮バイト列にしているようならバグの可能性があるでしょう。ファイルを圧縮ファイルに変換するようにしているのであれば、さすがにDLLのバグではないだろうでしょう。追加情報2によれば、いったんは候補から外していいかと思います。

TCPスタックも、IPv4ならもう枯れていると思ってよいかと。

ということで、TCPより上を疑います。FTP部分を自作しているのであればバグの可能性があるでしょう。

再現性が100%ではない場合、マルチスレッドセーフではないというバグを疑います。今回のケースだと、

  1. 圧縮側で、複数の圧縮処理が同時に走った
  2. 送信側で、複数の送信処理が同時に走った
  3. 受信側で、複数の受信処理が同時に走った
  4. 展開側で、複数の展開処理が同時に走った ← この可能性は消せる。∵圧縮ファイルがすでに破損している。

FTPのアクセスログのタイムスタンプを眺めて、3が発生していなかったか確認します。アクセス時刻が近くても、送信元が異なっていれば、1. 2. の可能性は消せるでしょう。

残るは3なので、テスト環境をたてて、事前に圧縮したファイルを使い、cURLとか apache JMeter とかを使ってFTPを同時に大量にぶっこみます。原因が 3. だとすればいつか再現するはず、ここで再現できれば勝ちなので、祈ります。

これは経験からですが、1日1回×半年で1回発生した故障の、マルチスレッドセーフでないことが原因だとしたら、長くても3日程度ぶん回し続ければ再現してくれるでしょう。

アクセス時刻が近い足跡がなかったとか、再現しなかったとしたら、さて、どうしましょう……

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/26 16:04

    ご回答ありがとうございます。
    FTPログを入手できていなかったので、確認してみたいと思います。
    また、ご提示いただいた検証内容についても、参考とさせていただきます。

    キャンセル

0

半年稼働で発生が1回だけとなると、原因の特定が難しいですね。
送信側は転送後ファイルを消してしまうとのことですが、送信前にZIPを解凍してみて正常に解凍できるか確認するようなコードを埋め込んでみてはどうでしょうか?
次発生した時に送信側かどうかの見極めはできると思います。
別途、ファイルのサムかハッシュコードを送る(ファイルに値を書き込んでそれをそのまま送る)様にして、送信側と受信側で一致するかどうか確認するとか、何かチェック用のコードを埋め込んで確認するしかないように思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/26 16:00

    ご回答ありがとうございます。
    おっしゃるとおり、次発生した場合に備えた対策を行う方向での検討もしようと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる