Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
ВнизКак вставить байты в файл и как их оттуда удалить??? Найти похожие ветки
← →
Sirus (2004-12-08 13:28) [0]Привет Мастера...
Есть вопрос: Подскажите быстрый способ вставки в файл определнного количества байт и как их оттуда удалить?
← →
Рамиль © (2004-12-08 13:34) [1]1 Загрузить в память с нужной позиции и записать обратно (если не большой).
2 переписать в другой файл и заменить
← →
Smithson (2004-12-08 13:35) [2]Что за файл?
Если файл поддердивает внутреннюю навигацию, то разговор один.
Если нет - "просто данные", то разговор другой и более печальный, поскольку способ один единственный - читаете файл до нужного места, вставляете/удаляете нужные байты, дочитываете файл до конца и записываете его обратно на диск. Где вы будете держать временные данные зависит от разных причин - можно в памяти, можно во временном файле. В памяти быстрее, во временном файле нет ограничения на размер обрабатываеого файла.
← →
Poirot © (2004-12-08 13:43) [3]>> во временном файле нет ограничения на размер обрабатываеого файла.
Ну это вы сильно сказали:) тту тогда можно опять много "если" наложить :)
по теме:
Вариат естственно один... Только лучче уж тогда скажи что ты хочешь конкретно.. т.е. проблему опиши:)
← →
Sirus (2004-12-08 13:45) [4]Мне создание временных файлов как-то влом идет, файл довольно таки здоровый. Файл обычный текстовый, вот там надо пару слов заменить на другую пару слов...
← →
TUser © (2004-12-08 13:48) [5]
> вот там надо пару слов заменить на другую пару слов
Повезло, если длина у них одинаковая. См. TFileStream
← →
Sirus (2004-12-08 13:51) [6]В том-то дело что-длина у них не одинаковая.
← →
Poirot © (2004-12-08 14:03) [7]Тогда тока тмп:)
← →
palva © (2004-12-08 15:40) [8]А если сделать резерв в виде пробелов в конце данной строки?
← →
Sun bittern © (2004-12-08 16:50) [9]>> Файл обычный текстовый, вот там надо пару слов заменить на другую пару слов...
TStringList.LoadFromFile(...);
AnsiReplaceTetx(TStringList.Tetx...);
TStringList.SaveToFile(...);
← →
Fay © (2004-12-09 04:02) [10]Я тут накидал фигулину. Заменяет на заданную строку блок некоторой длины по в некоторой позиции. Без временых файлов. Знаю что придраться есть к чему 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;
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.032 c