![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Каким образом лучше сохранять несколько потоков в один файл ?
infom © (2005-01-22 16:46:00)Какие существуют методы ?
Каждый поток есть таблица БД, все они абсолютно различны !!!
infom (2005-01-26 14:25:00) [1]А вот ещё вопрос....
У меня есть tADOQuery с данными, каким образом его можно сохранить в поток, у tADOQuery есть только SaveToFile а возможности использовать жесткий диск нет ?
infom (2005-01-26 14:19:00) [2]jack128 © (26.01.05 13:29) [18]
Спасибо я сам разобрался !
jack128 (2005-01-26 13:29:00) [3]infom © (26.01.05 13:00) [17]
а можно код привести?
Вот, у мя все нормально:
procedure SaveStreams(SourceStreams: array of TStream; DestStream: TStream; FromBegin: boolean = True);
var
i, Size: Integer;
begin
Size := high(SourceStreams) - low(SourceStreams) + 1;
DestStream.WriteBuffer(Size, SizeOf(Size));
for i := low(SourceStreams) to high(SourceStreams) do
begin
if FromBegin then
SourceStreams[i].Seek(0, 0);
Size := SourceStreams[i].Size - SourceStreams[i].Position;
DestStream.WriteBuffer(Size, SizeOf(Size));
if DestStream.CopyFrom(SourceStreams[i], Size) < Size then
raise Exception.Create('stream error');
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
const
MaxCount = 10;
var
Streams: array[0..MaxCount - 1] of TStream;
DestStream: TStream;
RealCount: Integer;
i: Integer;
begin
ZeroMemory(@Streams, SizeOf(Streams));
DestStream := nil;
with TOpenDialog.Create(nil) do
try
Title := 'SourceFile';
RealCount := MaxCount;
for i := 0 to MaxCount - 1 do
begin
if not Execute then
begin
RealCount := i;
Break;
end;
Streams[i] := TFileStream.Create(FileName, fmOpenRead);
end;
if RealCount = 0 then Exit;
Title := 'DestFile';
if not Execute then Exit;
DestStream := TFileStream.Create(FileName, fmCreate);
SaveStreams(Slice(Streams, RealCount), DestStream, True);
finally
FreeAndNil(DestStream);
for i := 0 to RealCount - 1 do
FreeAndNil(Streams[i]);
Free;
end;
end;
infom (2005-01-26 13:00:00) [4]jack128 © (22.01.05 17:03) [3]
а этот код массив из двух потоков размером в 22 кб и 12 кб засовывает в поток размером 24 кб !
infom (2005-01-26 12:40:00) [5]Erik1 © (26.01.05 12:14) [15]
В принципе я так сейчас и стараюсь что-то сделать, пока не далеко ушёл, но и на этом спасибо
Erik1 (2005-01-26 12:14:00) [6]Зря тебе код дали. Знаеш что такое заголовок? Вот и сделай его фиксированого размера, в нем и опиши название потока, начало потока, размер потока.
infom (2005-01-26 11:57:00) [7]jack128 © (25.01.05 18:57) [12]
извините что-то я про то, что переменная Size типа integer совсем не подумал
pasha_golub (2005-01-25 19:22:00) [8]jack128 © (25.01.05 18:57) [12]
Ну че ты издеваешься? Человек задал конкретный вопрос, хочет услышать конкретный ответ. А ты тут загадками... ;-)
jack128 (2005-01-25 18:57:00) [9]infom © (25.01.05 16:29) [10]
а прочитать этот поток не получиться так как я не знаю SizeOf(high(SourceStreams) - low(SourceStreams) + 1)
jack128 © (22.01.05 17:03) [3]
Size := high(SourceStreams) - low(SourceStreams) + 1;
DestStream.WriteBuffer(Size, SizeOf(Size));
Не на какие мысли не наводит? ;-)
Inco (2005-01-25 18:48:00) [10]2 infom ©
Брось, напиши все сам.
Смысл такой - пишешь в файловый поток размер Потока 1, потом сам Поток 1, затем размер Потока 2, затем Поток 2, и т.д.
Считываешь так: открываешь файловый поток, считываешь размер Потока1, потом считываешь этот "размер" байтов в отдельный поток - соответственно это и есть твоя таблица и т.д.
Главное, не забывай вовремя переставлять указатель потока на начало (Position := 0), иначе увидишь много интересных глюков.
infom (2005-01-25 16:29:00) [11]а прочитать этот поток не получиться так как я не знаю SizeOf(high(SourceStreams) - low(SourceStreams) + 1)
infom (2005-01-25 13:02:00) [12]так а как теперь их прочитать из этого потока ?
infom (2005-01-25 13:02:00) [13]так а как теперь их прочитать из этого потока ?
Fay (2005-01-22 17:46:00) [14]Точно можно
begin...end (2005-01-22 17:36:00) [15]> [5] jack128 © (22.01.05 17:35)
Я тоже раньше думал, что нельзя. Потом проверял - вроде бы, можно. :-)
jack128 (2005-01-22 17:35:00) [16]begin...end © (22.01.05 17:09) [4]
Я не уверен, что его можно применять к открытым массивам, а проверять было лень :-)
begin...end (2005-01-22 17:09:00) [17]> [2] jack128 © (22.01.05 17:01)
> Size := high(SourceStreams) - low(SourceStreams) + 1;
А как же Length?
jack128 (2005-01-22 17:03:00) [18]сорри, глюк маленький
procedure SaveStreams(SourceStreams: array of TStream; DestStream: TStream; FromBegin: boolean = True);
var
i:, Size: Integer;
begin
Size := high(SourceStreams) - low(SourceStreams) + 1;
DestStream.WriteBuffer(Size, SizeOf(Size));
for i := low(SourceStreams) to high(SourceStreams) do
begin
if FromBegin then
SourceStreams[i].Seek(0, 0);
Size := SourceStreams[i].Size - SourceStreams[i].Position;
DestStream.WriteBuffer(Size, SizeOf(Size));
if DestStream.CopyFrom(SourceStreams[i], Size) < Size then
raise Exception.Create('stream error');
end;
end
jack128 (2005-01-22 17:01:00) [19]
> Каким образом лучше сохранять несколько потоков в один
> файл ?
procedure SaveStreams(SourceStreams: array of TStream; DestStream: TStream; FromBegin: boolean = True);
var
i:, Size: Integer;
begin
Size := high(SourceStreams) - low(SourceStreams) + 1;
DestStream.WriteBuffer(Size, SizeOf(Size));
for i := low(SourceStreams) to high(SourceStreams) do
begin
Size := SourceStreams[i].Size;
DestStream.WriteBuffer(Size, SizeOf(Size));
if FromBegin then
SourceStreams[i].Seek(0, 0);
if DestStream.CopyFrom(SourceStreams[i], Size) < Size then
raise Exception.Create('stream error');
end;
end;
infom (2005-01-22 16:58:00) [20]Ладно чуть перефразирую вопрос.
Каким образом лучше сохранять несколько(заранее не известно) таблиц БД в один файл с последующем однозначном разделении файла на эти таблицы ?