c # Почему последний байт копируемого файла отличается? - PullRequest
1 голос
/ 30 декабря 2010

Я пишу программу для чтения и записи определенного двоичного формата файла.Я считаю, что у меня это работает на 95%.Я столкнулся со странной проблемой.

На снимке экрана я показываю программу, которую я написал, которая сравнивает два файла побайтно.Самый последний байт должен быть 0, но это FFFFFFF.

Используя бинарный просмотрщик, я не вижу разницы в файлах.Они кажутся идентичными.Кроме того, Windows сообщает мне, что размер файлов различен, но размер диска одинаков.

Может кто-нибудь помочь мне понять, что происходит?alt text

Оригинал слева, а моя копия справа.

Ответы [ 2 ]

1 голос
/ 30 декабря 2010

Возможные ответы:

  1. Вы забыли позвонить Stream.close() или Stream.Dispose().

  2. Ваш код испортил текст и другие данные (например, приведение -1 из Read() метода к char, затем запись его.

Нам нужен ваш код, хотя ...

0 голосов
/ 30 декабря 2010

Размер на диске против Размер

Прежде всего следует отметить, что размер на диске почти всегда отличается от значения Размер , поскольку значение Размер на диске отражает выделенный диск. хранилища, но Размер отражает фактическую длину файла.

Дисковод разбивает свое пространство на блоки одинакового размера. Например, если ваш диск работает с блоками 4 КБ, то даже самый маленький файл, содержащий один байт, все равно будет занимать 4 КБ на диске, поскольку это минимальное пространство, которое он может выделить. После того, как вы записали 4KB + 1 байт, он выделит еще один 4KB блок памяти, таким образом, сделав его 8KB на диске. Следовательно, размер на диске всегда кратен 4 КБ. Таким образом, тот факт, что исходный и целевой файлы имеют одинаковый размер на диске , не означает, что файлы имеют одинаковую длину. (Различные диски имеют разные размеры блоков, это не всегда 4 КБ).

Значение Размер является фактической определенной длиной данных файла в дисковых блоках.

Ваш размер вопроса

Поскольку ваши значения Size отличаются, это означает, что операционная система сохранила данные различной длины. Следовательно, у вас есть фундаментальная проблема с вашей процедурой копирования, а не просто проблема с последним байтом, как вы думаете в данный момент. Один из ваших файлов - 3434 байта, а другой - 2 008, что является большой разницей. Ваш первый шаг должен понять, почему у вас такая большая разница.

Если ваша процедура сравнения в шестнадцатеричном формате просто просматривает данные блока, то она будет считать, что они имеют ту же длину, что и сравниваемые блоки диска, а не фактическую длину файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...