2010-12-30 14 views
1

私は特定のバイナリファイル形式を読み書きするプログラムを作成しています。 私は95%働いていると思います。私は奇妙な問題にぶつかっています。c#コピーしたファイルの最終バイトが異なるのはなぜですか?

このスクリーンショットでは、2つのファイルを1バイトずつ比較するプログラムを示しています。最後のバイトは0にする必要がありますが、FFFFFFFです。

バイナリビューアを使用すると、ファイルに違いは見られません。彼らは同一であるように見えます。 また、Windowsではファイルのサイズが異なるが、ディスク上のサイズは同じであることがわかります。

誰かが私に何が起こっているのか理解できますか? alt text

オリジナルは左側にあり、コピーは右側にあります。

+0

最後のバイトは '0xFF'ではなく' 0xFF'です。 また、プログラムのスニペットを表示できますか?このように物事をピン止めするのは難しいです。 – Mehrdad

+1

そして、実際に比較やコピーを行ったり、間違っているコードはどこにありますか? – LukeH

+0

ディスク上のサイズは、ディスクの 'cluster'サイズ(ディスクフォーマットオプション)の倍数であるため、バイトはおそらく境界を越えません。 – Xaqron

答えて

1

可能な答えは:

  1. あなたはStream.close()またはStream.Dispose()に電話をするのを忘れました。

  2. あなたのコードでは、例えば、それを書いた後、charRead()方法から-1をキャスト(テキストをめちゃくちゃにして、データの他の種類れる。

我々はしかし、あなたのコードを参照する必要があります。.. サイズ対ディスク上。

+0

私はストリームを閉じることを忘れなかった。 – Paul

+0

私はそのコピーがちょうど1バイトだけ異なっているので、私はデータを台無しにしているのではないかと疑います。 – Paul

+0

私は無視したゼロバイトでファイルを終了する必要があることが判明しました。 – Paul

0

サイズすべての

まずあなたがshoulディスク値にサイズが割り当てられたドライブストレージを反映しているが、サイズは、ファイルの実際の長さを反映しているため、ディスク上のサイズは、ほとんど常にサイズ値とは異なる次元のノート。

ディスクドライブは、そのスペースを同じサイズのブロックに分割します。たとえば、ドライブが4KBのブロックで動作する場合、1バイトを含む最小のファイルでさえ、ディスク上で4KBを占有します。これは割り当て可能な最小スペースであるためです。 4KB + 1バイトを書き出すと、別の4KBのストレージブロックが割り当てられ、ディスク上に8KBになります。したがって、ディスクのサイズは常に4KBの倍数です。したがって、ソースファイルとコピー先ファイルが同じのディスク上のサイズであるということは、ファイルの長さが同じであることを意味しません。 (異なるドライブは異なるブロックサイズを持ちますが、必ずしも4KBではありません)。

サイズ値は、ディスクブロック内のファイルデータの実際に定義された長さです。

あなたのサイズの問題

あなたサイズ値が異なっているとして、それは、オペレーティング・システムは、データの異なる長さを保存していることを意味します。したがって、コピールーチンには根本的な問題があり、現時点での最終バイトの問題だけではありません。あなたのファイルの1つは3,434バイトで、もう1つは2,008です。これは大きな違いです。あなたの最初の一歩は、あなたがそのような大きな違いを持っ​​ている理由を理解することでなければなりません。

ブロック比較のルーチンでは、実際にファイルの長さではなくディスクブロックを比較しているのと同じ長さであると考えられます。

関連する問題