Помощь - Поиск - Пользователи - Календарь
Полная версия: Замена строки в файле
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
Unconnected
Привет всем.

Нужно написать программу, которая заменяла бы в другом файле одну строку на другую, в смысле именно внутри файла. Нашёл код, который это делает, но там условие, чтобы заменяемая и заменяющая строки были одной длины, а мне надо, чтобы заменяющая строка могла быть больше... В принципе, можно сделать, чтобы заменяемая строка была дополнена сторонними символами, пробелами, например, а при замещении при надобности их удалять. Но, может быть, можно при замещении большей строкой "сдвигать" оставшуюся часть файла?
amega
а такой вариант не подойдет что б, скопировать сожрежимое файла в память, заменить нужно и перезаписать файл?
Unconnected
Ну так и будет, или почти так. Вопрос в соответствии длин строк. Попробуй открыть какую нибудь программа HEX-редактором, чтобы нагляднее было, что там внутри:)
volvo
Это смотря какой файл (в смысле, формат файла). Может случиться, что даже при замене строк равной длины ты получишь проблемы (скажем, если считается CRC, или что-нибудь еще).
Unconnected
Цитата
Это смотря какой файл (в смысле, формат файла). Может случиться, что даже при замене строк равной длины ты получишь проблемы (скажем, если считается CRC, или что-нибудь еще).


А, ну EXE, ничем не упакованный, без проверки контрольной суммы..
volvo
А ты попробуй заменить строку на другую через какой-нибудь Resource Editor, или ResHacker, что-то в этом роде. Я к тому, что строка в EXE-файле она ведь тоже по-разному может представляться. Если с помощью вышеперечисленных программ удалось, то можно попробовать и вручную сделать то же самое. Программа, в которой надо что-то менять, твоя или чужая? (я к тому, что если чужая - то почему ты уверен, что она неупакована, и всегда будет таковой?)

Еще один вопрос: Может, проще менять не в файле, а после запуска найти нужный контрол и там поменять текст? smile.gif
Unconnected
Ну, с помощью WinHEX'а получилось. Программа моя, поэтому искомый заменяемый текст будет жёстко задан.
И надо, чтобы именно создавался с определённой строкой. Создать можно с помощью ресурса, а как так заменить, я не знаю..
volvo
Цитата
Создать можно с помощью ресурса, а как так заменить, я не знаю..
См. здесь: Sources.RU -> Добавление ресурса
Unconnected
Цитата
Создать можно с помощью ресурса, а как так заменить, я не знаю..
См. здесь: Sources.RU -> Добавление ресурса


Я, наверное, не так выразился.. Как добавить ресурс, и извлечь его, я знаю, мне надо программно заменить в другом файле строку.
volvo
Ты по ссылке-то пройди (то, что ты не был там, я вижу, ты говоришь, ориентируясь на НАЗВАНИЕ, а не на СОДЕРЖАНИЕ smile.gif )
Unconnected
В итоге получилось следующее:) Через HEX-редактор я нашёл в файле адрес нужной строки(в изменяемой программе эта строка предварительно была дополнена пробелами, чтобы был запас длины) и в "билдере" патчил файл побайтно.


var f:thandle;
fils:integer;
mes:string;
i:integer;
c:byte;
BytesRead,c2:DWORD;
begin
mes:=smemo1.text;
c2:=$5C64;
for i:=1 to length(mes) do
begin
c:=ord(char(pchar(mes[i])));
SetFilePointer(f, c2, nil, 0);
WriteFile(f, c, SizeOf©, BytesRead, nil);
inc(c2);
end;
end;


Хорошо, что оказался возможным инкремент DWord'а.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.