|
1 / 1 / 1
Регистрация: 16.11.2011
Сообщений: 55
|
|
.NET 4.x Можно ли изменить или удалить данные в бинарном файле30.05.2017, 14:37. Показов 7109. Ответов 3
Метки нет (Все метки)
Здравствуйте. В C# есть класс BinaryWriter, который позволяет записывать данные в бинарный файл. Но, везде указано, как добавлять данные в бинарный файл, в конец файла, а можно ли внести изменение в середину файла, или удалить данные из середины файла. Допустим есть класс с атрибутами, скажим пару int, и пару string, и есть класс коллекции для предыдущего класса, с десятком готовых экземпляров. Далее в бинарный файл последовательно, атрибут за атрибутом, сохраняется вся коллекция. Далее происходит изменение какого либо экземпляра класса из коллекции, и, чтобы полностью не перезаписывать весь бинарный файл, хотелось бы изменять скажем только часть файла, начиная с изменившегося экземпляра. Или при удалении, не создавать фактически снова весь файл, а удалить ненужный экземпляр коллекции, и далее просто дозаписать всю оставшуюся часть коллекции вместо удаленного экземпляра, и до конца коллекции.
0
|
|
| 30.05.2017, 14:37 | |
|
Ответы с готовыми решениями:
3
Изменить слово в бинарном файле Не получается изменить данные в бинарном файле Как изменить один байт в бинарном файле? |
|
0 / 0 / 2
Регистрация: 30.05.2017
Сообщений: 11
|
|
| 30.05.2017, 14:51 | |
|
0
|
|
|
1 / 1 / 1
Регистрация: 16.11.2011
Сообщений: 55
|
|
| 30.05.2017, 15:36 [ТС] | |
|
Тут есть несколько проблем. Во первых, в этом примере, используется только int32, 4-байтовый, и можно вычислить смещение, и заменить значение, при этом даже размер файла не уменьшится. В случае же со string, как я понимаю, размер данных будет зависеть от количество символов. И если даже взять просто одну строку string, размером в 100 символов, то после замены середины файла, количество символов может просто уменьшится, а что при этом будет с оставшейся частью файла? Кроме того, я никак не могу в принципе вычислить размер экземпляра класса, или хотя бы размер инициализированной переменной типа string.
Добавлено через 20 минут Да, string вычислить можно, просто надо количество символов перемножить на размер одного символа в нужной кодировке. Но вот вычислить, сколько займет места в бинарном файле с десяток атрибутов класса, весьма трудно, а ведь потом чтобы сместиться в нужную позицию файла, надо точно знать, сколько места занимает каждый сохраненный экземпляр класса коллекции.
0
|
|
|
|
|
| 31.05.2017, 08:54 | |
Сообщение было отмечено paradox81ru как решение
Решение
paradox81ru,
1) Зачем вам это нужно? Такие манипуляции обычно нужны если у вас ну очень большой объем файла и очень критично быстродействие. Если это не так, то нужно просто читать файл в память, выполнять манипуляции а потом уже сохранять обратно. 2) Прямых методов вставки данных внутрь файла не существует (есть только запись поверх). Даже если бы и было, то по любому системе придется смещать и копировать хвост файла, то есть фактически делать пункт 1, но на более низком уровне. 3) А если уж все таки очень нужно, то такие вещи достигаются специальной структурой файла. Внутри файла запись идет отдельными блоками ("записями") и порядок записей регулируется не их последовательностью в файле, а специальной таблицей (типа FAT) или отдельным списком. Тогда вместо вставки записи внутрь файла, запись дописывается в конец, и меняется соотв образом таблица.
1
|
|
| 31.05.2017, 08:54 | |
|
Помогаю со студенческими работами здесь
4
Удалить запись в бинарном файле Удалить строку в бинарном файле Секретные данные в бинарном файле Изменить положение камеры в существующем .exe файле 3D приложения, или как можно сместить камеру в 3D приложении Можно ли удалить или вставить данные в базу в global.asa при событии session_onEnd ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|