![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Удаление из 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 байт, начиная с определенного места. Никто не знает?