Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.26;
Скачать: CL | DM;

Вниз

Как вставить байты в файл и как их оттуда удалить???   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
14-1102020466
Marser
2004-12-02 23:47
2004.12.26
Хотелось бы узнать вашу точку зрения


3-1101163399
GanibalLector
2004-11-23 01:43
2004.12.26
Запрос


3-1101663252
Ярослав
2004-11-28 20:34
2004.12.26
Добавление записей в таблицу IB


1-1102668128
Usat|k
2004-12-10 11:42
2004.12.26
Форма на все окно


1-1102691235
Ольга
2004-12-10 18:07
2004.12.26
Почему плодятся процессы EXCEL.EXE (D6, Excel 2000)