Текущий архив: 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.48 MB
Время: 0.027 c