Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: 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 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
1-1107240934
syte_ser78
2005-02-01 09:55
2005.02.13
TLSDNumber


14-1106300659
Prepod
2005-01-21 12:44
2005.02.13
литература


14-1106408181
Artvz
2005-01-22 18:36
2005.02.13
Кто нибудь знает ресурс посвящённый алгоритмам и разработке


1-1106828861
WhiteGuy
2005-01-27 15:27
2005.02.13
FreeDiskSpace?


1-1106920597
KAA_VS_1C
2005-01-28 16:56
2005.02.13
консольное приложение - перехватить ввод