![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема потоков в KOL (Stream2Stream) [Delphi, Windows]
Dentall © (2004-01-02 21:33:00)Не получается скопировать Stream2Stream когда исходный поток - MemoryStream, а поток назначения - файл. Из файла в файл работает. В чем проблема?
Dentall (2004-01-05 19:26:00) [1]Действительно, скачаннная с этого сайта работает :)... Кстати, у нового модуля размер больше...
mmn (2004-01-05 16:43:00) [2]Только что попробовал использовать метод SaveToFile файла id3v2.pas из архива Audio Tools Library (портированным в KOL Матвеевым Дмитрием). Всё записалось нормально. Если мне не изменяет склероз, то скачал я его с этого сайта.
Dentall (2004-01-05 14:11:00) [3]Из модуля id3v2.pas (есть на этом сайте - архив Tags.zip). При вызове SaveToFile файл становится 0 длины. Попробовал оба вышеуказыннх совета - не помогло ... :( Привожу кусок кода (для тех кто поленится заглянуть в указанный модуль)
function RebuildFile(const FileName: string; TagData: PStream): Boolean;
var
Tag: TagInfo;
Source, Destination: PStream;
BufferName: string;
begin
{ Rebuild file with old file data and new tag data (optional) }
Result := false;
if (not FileExists(FileName)) or (FileSetAttr(FileName, 0) <> 0) then exit;
if not ReadHeader(FileName, Tag) then exit;
if (TagData = nil) and (Tag.ID <> ID3V2_ID) then exit;
try
{ Create file streams }
BufferName := FileName + '~';
Source := NewFileStream(FileName, ofOpenRead or ofShareExclusive);
Destination := NewFileStream(BufferName, ofCreateNew);
{ Copy data blocks }
if Tag.ID = ID3V2_ID then Source.Seek(GetTagSize(Tag), spBegin);
if TagData <> nil then Stream2Stream(Destination, TagData, TagData.Size);
// source.Seek(0,spBegin);
Stream2Stream(Destination, Source, Source.Size - Source.Position);
{ Free resources }
Source.Free;
Destination.Free;
{ Replace old file and delete temporary file }
if DeleteFile(PChar(FileName)) and MoveFile(PChar(BufferName), PChar(FileName)) then
Result := true
else Str2Int('');
except
if FileExists(BufferName) then DeleteFile(PChar(BufferName));
end;
end;
function SaveTag(const FileName: string; Tag: TagInfo): Boolean;
var
TagData: PStream;
Iterator, FrameSize: Integer;
begin
TagData := NewMemoryStream;
BuildHeader(Tag);
TagData.Write(Tag, 10);
for Iterator := 1 to ID3V2_FRAME_COUNT do
if Tag.Frame[Iterator] <> '' then
begin
TagData.WriteStr(ID3V2_FRAME_NEW[Iterator]);
FrameSize := Swap32(Length(Tag.Frame[Iterator]) + 1);
TagData.Write(FrameSize, SizeOf(FrameSize));
TagData.WriteStr(#0#0#0 + Tag.Frame[Iterator]);
end;
///TagData.Seek(0,spBegin);
//TagData.position:=0;
Result := RebuildFile(FileName, TagData);
TagData.Free;
end;
Che (2004-01-03 14:41:00) [4]Скорее всего проблемы с потоком из за позиции. Сужу по себе :)Забываю я про нее... Например надо дописать в конец потока MemoryStream данные из файла
xxxx := NewMemoryStream;
// тут в это xxxx что нибуть пишем
ffff := NewReadFileStream('f.txt');
xxxx.Position :=0; // <- а вот если забыть не заработает
Stream2StreamEx(ffff,xxxx,xxxx.Size);
Всех с НГ.
Boguslaw (2004-01-03 00:03:00) [5]Probably should been scrolled to the beginning (assume You wrote something to MemoryStream before)
so try :
MemoryStream.Seek(0,spBegin) just before Stream2Stream
Happy New Year !