Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Удаление из TFileStream [D7, WinXP]


K@rt ©   (2005-01-26 12:14:00) 

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


begin...end   (2005-01-28 14:39:00) [1]


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

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


begin...end   (2005-01-28 14:20:00) [2]

> [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]).


Александр Иванов   (2005-01-28 12:27:00) [3]

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


k@rt   (2005-01-28 12:20:00) [4]

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


k@rt   (2005-01-27 00:01:00) [5]

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


begin...end   (2005-01-26 21:43:00) [6]

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

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

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


dimaxx   (2005-01-26 21:25:00) [7]

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


K@rt   (2005-01-26 18:18:00) [8]

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


Александр Иванов   (2005-01-26 17:48:00) [9]

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


K@rt   (2005-01-26 17:45:00) [10]

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


TUser   (2005-01-26 16:35:00) [11]

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


Александр Иванов   (2005-01-26 16:05:00) [12]

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


K@rt   (2005-01-26 16:03:00) [13]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо