суббота, 21 мая 2011 г.

Маленькие хитрости: cкрываем медиаданные или удаление произвольного количества байт в произвольном месте

Тема показалась мне интересной. Вкратце, используется прошлый пример выделения буфера в поток для воспроизведения аудиофайла с n-й позиции в файле с той предисторией, что в начало видеоролика будет записано n-е количество мусора. Проблема решалась проверкой размерности буфера, а можно было вообще использовать свойство MemoryStream-потока CopyFrom(), что в принципе видно из MSDN...

Как можно удалить n-е количество байт не с нуля файла, а с произвольного места? В общем, вот что получилось:
procedure del_byte(filename: string; pos_start, pos_end: integer);
var dest1, dest2, dest: tmemorystream;
    link: tfilestream;
begin
 dest1:= TMemoryStream.Create;
 dest2:= TMemoryStream.Create;
 dest := TMemoryStream.Create;
 link := TfileStream.Create(filename, fmOpenRead or fmShareExclusive);

 link.Position:= 0;
 if pos_start<>1 then
  dest1.CopyFrom(link, pos_start-1);
 link.Position:= pos_end;
 dest2.CopyFrom(link, link.Size - pos_end);
 dest1.Position:= 0;
 dest.CopyFrom(dest1, dest1.Size); dest2.Position:= 0;
 dest.CopyFrom(dest2, dest2.Size);
 // условно говоря - файл уже в памяти, но чтобы убедится, проверяем
 dest.SaveToFile('2.txt');

 Link.Free; Dest1.Free;
 Dest2.Free;
 dest.Free

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 del_byte('1.txt', 2, 5)
end;
Код не оптимизировал, но пользоваться можно.

забрать добро

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.