2017-01-23 13 views
0

Я знаю, это звучит несколько запутанно. но мне было интересно, есть ли способ поддерживать структуру файла и редактировать его, даже если он добавляет данные в какую-то часть файла или редактирует значение из определенной позиции.Сбор двоичных данных из файла на C# и редактирование или добавление данных без записи всего файла снова

Что я сейчас делаю, чтобы редактировать двоичные файлы, это кодировать парсер с классом BinaryReader (в C#), считывая определенную структуру с помощью reader.readSingle, readInt и т. Д.

Затем я пишу то же самое с BinaryWriter, который кажется вроде неэффективным, и, возможно, я могу ошибаться и делать различия между читателем и автором, делая формат непоследовательным.

Есть ли какой-либо способ определить структуру файла и выполнить весь процесс автоматически для чтения и записи с определением одного формата? Или, если вы можете открыть файл, отредактируйте некоторые его значения (или добавьте, так как это не фиксированный формат, чтение будет означать, например, некоторые из циклов) и сохранить эти изменения?

Я надеюсь, что я объяснил себя в красивый понятной форме

ответ

1

Если вы хотите вставить новые данные в двоичный файл, у вас есть три варианта:

  1. Переместить все с этого момента немного вниз так что вы освободите место для новых данных.
  2. Как-то отмечают, что существующие данные больше не актуальны (т. Е. Удаленный флаг) и добавляют новые данные в конец файла.
  3. Замените существующие данные указателем на другое место в файле (обычно в конце файла), где хранятся новые данные.

Первый способ требует перезаписи всего файла.

Второй способ может работать хорошо, если это файл записей, например, и если вы не зависеть от порядка записей в файле. Становится сложнее, если файл имеет сложную структуру вложенных записей и т. Д. У этого есть недостаток, оставляющий много свободного места в файле.

Третий метод похож на второй, но работает хорошо, если вы используете произвольный доступ, а не последовательный доступ. Он по-прежнему заканчивается тратой пространства в файле.