![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как вставить байты в файл и как их оттуда удалить??? [D5, D6, Win95/98, Win2k, WinXP]
Sirus © (2004-12-08 13:28:00)Привет Мастера...
Есть вопрос: Подскажите быстрый способ вставки в файл определнного количества байт и как их оттуда удалить?
Fay (2004-12-09 04:02:00) [1]Я тут накидал фигулину. Заменяет на заданную строку блок некоторой длины по в некоторой позиции. Без временых файлов. Знаю что придраться есть к чему 8)
procedure Repl(const FileName, NewStr : string; dwPos, dwLen : DWORD);
const
MIN_BSZ = 4096;
var
br, bw : PChar;
bsz, hr, hw, nr, nw, n : DWORD;
label
Labels_Rulezz;
begin
hw := CreateFile(PChar(FileName), GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
if hw = INVALID_HANDLE_VALUE then RaiseLastOsError;
hr := INVALID_HANDLE_VALUE;
br := nil;
bw := nil;
try
hr := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
if hr = INVALID_HANDLE_VALUE then RaiseLastOsError;
SetFilePointer(hw, dwPos, nil, FILE_BEGIN);
SetFilePointer(hr, dwPos + dwLen, nil, FILE_BEGIN);
n := Length(NewStr);
bsz := MIN_BSZ;
while (bsz + dwLen) < n do
bsz := bsz shl 1;
GetMem(br, bsz);
GetMem(bw, bsz);
Move(PChar(NewStr)^, br^, n);
goto Labels_Rulezz;
repeat
WriteFile(hw, bw^, n, nw, nil);
n := nr;
Labels_Rulezz :
Move(br^, bw^, n);
ReadFile(hr, br^, bsz, nr, nil);
until n = 0;
SetEndOfFile(hw);
finally
if hr <> INVALID_HANDLE_VALUE then CloseHandle(hr);
CloseHandle(hw);
if br <> nil then FreeMem(br);
if bw <> nil then FreeMem(bw);
end;
end;
Sun bittern (2004-12-08 16:50:00) [2]>> Файл обычный текстовый, вот там надо пару слов заменить на другую пару слов...
TStringList.LoadFromFile(...);
AnsiReplaceTetx(TStringList.Tetx...);
TStringList.SaveToFile(...);
palva (2004-12-08 15:40:00) [3]А если сделать резерв в виде пробелов в конце данной строки?
Poirot (2004-12-08 14:03:00) [4]Тогда тока тмп:)
Sirus (2004-12-08 13:51:00) [5]В том-то дело что-длина у них не одинаковая.
TUser (2004-12-08 13:48:00) [6]
> вот там надо пару слов заменить на другую пару слов
Повезло, если длина у них одинаковая. См. TFileStream
Sirus (2004-12-08 13:45:00) [7]Мне создание временных файлов как-то влом идет, файл довольно таки здоровый. Файл обычный текстовый, вот там надо пару слов заменить на другую пару слов...
Poirot (2004-12-08 13:43:00) [8]>> во временном файле нет ограничения на размер обрабатываеого файла.
Ну это вы сильно сказали:) тту тогда можно опять много "если" наложить :)
по теме:
Вариат естственно один... Только лучче уж тогда скажи что ты хочешь конкретно.. т.е. проблему опиши:)
Smithson (2004-12-08 13:35:00) [9]Что за файл?
Если файл поддердивает внутреннюю навигацию, то разговор один.
Если нет - "просто данные", то разговор другой и более печальный, поскольку способ один единственный - читаете файл до нужного места, вставляете/удаляете нужные байты, дочитываете файл до конца и записываете его обратно на диск. Где вы будете держать временные данные зависит от разных причин - можно в памяти, можно во временном файле. В памяти быстрее, во временном файле нет ограничения на размер обрабатываеого файла.
Рамиль (2004-12-08 13:34:00) [10]1 Загрузить в память с нужной позиции и записать обратно (если не большой).
2 переписать в другой файл и заменить