Вниз
Скачать: CL | DM;

Удаление из TFileStream   Найти похожие ветки 

← →
K@rt ©   (2005-01-26 12:14) [0]

Как удалять из TFileStream?


← →
K@rt ©   (2005-01-26 16:03) [1]

Мне надо удалить n байт, начиная с определенного места. Никто не знает?


← →
Александр Иванов ©   (2005-01-26 16:05) [2]

Переписать из одного в другой, за исключением удаляемого фрагмента.


← →
TUser ©   (2005-01-26 16:35) [3]

Или сдвигать байты в данном TFileStream


← →
K@rt ©   (2005-01-26 17:45) [4]

Т.е. сдвигать байты?


← →
Александр Иванов ©   (2005-01-26 17:48) [5]

K@rt ©   (26.01.05 17:45) [4]
Read/Write


← →
K@rt ©   (2005-01-26 18:18) [6]

Александр Иванов ©   (26.01.05 17:48) [5]
А если писать по середине TFIleStream, все последующие байты сдвигаються или заменяються новыми?


← →
dimaxx ©   (2005-01-26 21:25) [7]

Если писать в середине потока, то все, что было c текущей позиции, теряется. Чтобы не терять - использовать BlockRead/BlockWrite.


← →
begin...end ©   (2005-01-26 21:43) [8]

> [7] dimaxx ©   (26.01.05 21:25)

> Чтобы не терять - использовать BlockRead/BlockWrite.

А Вы ничего не путаете?


← →
k@rt ©   (2005-01-27 00:01) [9]

Так чего же происходит с байтами, начиная с позиции в которой мы пишем в поток? Они - Теряются or Сдвигаются or Заменяются?


← →
k@rt ©   (2005-01-28 12:20) [10]

Кто-нибудь может ответить?


← →
Александр Иванов ©   (2005-01-28 12:27) [11]

k@rt ©   (28.01.05 12:20) [10]
(27.01.05 0:01)
(28.01.05 12:20)
За сутки мог бы и попробовать.


← →
begin...end ©   (2005-01-28 14:20) [12]

> [9] k@rt ©   (27.01.05 00:01)

И действительно - попробовали бы уже сами. Байты заменяются.

А проверить это очень просто. Например, можно записать в файл некоторое количество (например, N) байт, затем переместиться на начало файла и записать меньшее количество (например, N / 2) байт. Если после этого размер потока составит N + N / 2 байт - значит, байты вставляются (добавляются). Если же он останется равным N байтам - значит, байты заменяются.

Вот пример. В нём создаётся новый файл, в него записываются 20 байт, содержащих значение $00. Затем позиция внутри потока перемещается на его начало и записываются ещё 10 байт, содержащих значение $FF. После создания потока, первой и второй записи выводятся сообщения о текущем размере потока.

var
 Buffer1, Buffer2: Pointer;
begin
 with TFileStream.Create("c:\test.bin", fmCreate) do
 begin
   GetMem(Buffer1, 20);  // Выделяем память под первый буфер
   GetMem(Buffer2, 10);  // Выделяем память под второй буфер
   try
     FillMemory(Buffer1, 20, $00);  // Заполняем первый буфер нулями
     FillMemory(Buffer2, 10, $FF);  // Заполняем второй буфер единицами
     ShowMessageFmt("Размер файла сразу после создания: %d", [Size]);
     Write(Buffer1^, 20);  // Пишем первый буфер
     ShowMessageFmt("Размер файла после записи 20 байт: %d", [Size]);
     Seek(0, soFromBeginning);  // Перемещаемся в начало потока
     Write(Buffer2^, 10);  // Пишем второй буфер
     ShowMessageFmt("Размер файла после записи в начало 10 байт: %d", [Size])
   finally
     // Освобождение памяти
     FreeMem(Buffer1);
     FreeMem(Buffer2);
     Free
   end
 end
end.


Сообщения покажут 0, 20, 20. Значит, байты действительно заменяются.

Полезно также открыть теперь этот файл в шестнадцатеричном редакторе (например, в FAR"е: F3, а затем F4) и посмотреть на его содержимое.

И никакие BlockWrite тут тоже не помогут. Потому что, во-первых, у TFileStream такого метода нет, а во-вторых, если использовать процедуру BlockWrite для нетипизированных файлов, то результат будет тот же самый, - байты будут заменяться. И это тоже легко проверить.

Так что выход один - делать это вручную. Несколько вариантов того, как именно это можно сделать, уже привели ранее (см., например, [2] и [3]).


← →
begin...end ©   (2005-01-28 14:39) [13]


> Так что выход один - делать это вручную.

Я имел в виду - удалять байты из TFileStream вручную.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.025 c
8-1098848515
Baron_
2004-10-27 07:41
2005.02.13
Winamp. Как узнать какая песня проигрывается(Название), ...


14-1106243813
madmouse
2005-01-20 20:56
2005.02.13
Вопрос


14-1106561636
RTS
2005-01-24 13:13
2005.02.13
Работа с TTreeView and TTreeNode


1-1106881630
gsformat
2005-01-28 06:07
2005.02.13
как отловить утечку памяти


3-1105515172
AlexTregubov
2005-01-12 10:32
2005.02.13
Как сделать запрос




   Наверх