Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

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

Вячеслав Власов Гуру (3453), закрыт 6 лет назад
Дополнен 6 лет назад
* поверх существующей строки в бинарном файле
Лучший ответ
... Гений (84839) 6 лет назад
Функции перемещают позицию чтения/записи в файле:
FileSeek, если работаете с файлами через Handle
http://mycpp.ru/delphi/help/name.php?name=FileSeek

Seek, если работаете с файлами типа File
http://mycpp.ru/delphi/help/name.php?name=Seek

Затем как обычно запись.
Вячеслав ВласовГуру (3453) 6 лет назад
Есть пока вот такой код, правда выдающий ошибку в конце.
И его проблема в том, что он затер все начало файла нулями произвел запись (в общем-то правильно) в середине и обрезал файл в конце сразу после окончания записываемой строки.

procedure Save(lv1: TListView; FileName: string; Nullbytes: integer);
var
i: integer;
s: string;
begin
with TFileStream.Create(FileName, fmCreate or fmOpenWrite) do
try
Seek(offst, soFromBeginning);
for i := 0 to lv1.Items.Count do
begin
Write(s[1], Length(s));
end;
finally
Free;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
try
Save(lv1, 'mn.bin');
except
showmessage('Error!');
end;
Вячеслав Власов Гуру (3453) Думаю, вот это под сомнением: with TFileStream.Create(FileName, fmCreate or fmOpenWrite) do
Остальные ответы
Павел Просветленный (25963) 6 лет назад
Просто записать блок в середину нельзя. Нужно скопировать содержимое, которое будет идти после вставленного блока в буфер, записать блок (блок затрет все, что после него) и записать конец файла из буфера.
...Гений (84839) 6 лет назад
Та можно. Что-ж нет....
Павел Просветленный (25963) Ну, низя.. Преподы всегда это вбивали, что проблема не в языке, а в файловой системе.
Вячеслав ВласовГуру (3453) 6 лет назад
Исходя из комментариев первого ответа, вчера попробовал использовать собственный код, убрав флаг fmCreate. И все записалось как надо. Причем, т. к. строка для записи была меньше (в одной из строк ListView я уменьшил кол-во символов, по сравнению с оригиналом), в файле даже остались остатки старого текста (надо будет добавить затирание нулевыми байтами, если текстовый блок - меньше оригинального). Т. е. файл уже не урезается до участка окончания записи. Так что не знаю, какие там могут быть проблемы с файловой системой. В FAT32 не пробовал, но это очень и не нужно.
... Гений (84839) Случайно перечитывал ответы и комменты... Если работать с File - процедура Truncate обрежет до текущей позиции Если с TFileStream - SetSize В FAT без проблем есс-но тоже. Она ещё проще устроена.
Евгений Гуру (3704) 6 лет назад
Установить позицию в файле на начало нужной строки (fileseek) и сделать запись (blockwrite)
Похожие вопросы