Главная страница
    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.48 MB
Время: 0.027 c
1-1107184591
kivadim
2005-01-31 18:16
2005.02.13
как записать строку в св-во Objects компонента combobox?


4-1104144220
Tack
2004-12-27 13:43
2005.02.13
Отловить моменты начала и конца прокрутки TRichEdit


14-1106337070
olookin
2005-01-21 22:51
2005.02.13
Есть у кого склонность сыграть в шахматы на netcenter.pogo.com?


1-1106821814
Ega23
2005-01-27 13:30
2005.02.13
Копирование данных из TStream в буффер.


6-1101480735
Muhan
2004-11-26 17:52
2005.02.13
Как выудить данные с интернет страницы с помощью ссылки в Делфи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский