Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
ВнизКаким образом лучше сохранять несколько потоков в один файл ? Найти похожие ветки
← →
infom © (2005-01-22 16:46) [0]Какие существуют методы ?
Каждый поток есть таблица БД, все они абсолютно различны !!!
← →
infom © (2005-01-22 16:58) [1]Ладно чуть перефразирую вопрос.
Каким образом лучше сохранять несколько(заранее не известно) таблиц БД в один файл с последующем однозначном разделении файла на эти таблицы ?
← →
jack128 © (2005-01-22 17:01) [2]
> Каким образом лучше сохранять несколько потоков в один
> файл ?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;
← →
jack128 © (2005-01-22 17:03) [3]сорри, глюк маленький
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
← →
begin...end © (2005-01-22 17:09) [4]> [2] jack128 © (22.01.05 17:01)
> Size := high(SourceStreams) - low(SourceStreams) + 1;
А как же Length?
← →
jack128 © (2005-01-22 17:35) [5]begin...end © (22.01.05 17:09) [4]
Я не уверен, что его можно применять к открытым массивам, а проверять было лень :-)
← →
begin...end © (2005-01-22 17:36) [6]> [5] jack128 © (22.01.05 17:35)
Я тоже раньше думал, что нельзя. Потом проверял - вроде бы, можно. :-)
← →
Fay © (2005-01-22 17:46) [7]Точно можно
← →
infom © (2005-01-25 13:02) [8]так а как теперь их прочитать из этого потока ?
← →
infom © (2005-01-25 13:02) [9]так а как теперь их прочитать из этого потока ?
← →
infom © (2005-01-25 16:29) [10]а прочитать этот поток не получиться так как я не знаю SizeOf(high(SourceStreams) - low(SourceStreams) + 1)
← →
Inco (2005-01-25 18:48) [11]2 infom ©
Брось, напиши все сам.
Смысл такой - пишешь в файловый поток размер Потока 1, потом сам Поток 1, затем размер Потока 2, затем Поток 2, и т.д.
Считываешь так: открываешь файловый поток, считываешь размер Потока1, потом считываешь этот "размер" байтов в отдельный поток - соответственно это и есть твоя таблица и т.д.
Главное, не забывай вовремя переставлять указатель потока на начало (Position := 0), иначе увидишь много интересных глюков.
← →
jack128 © (2005-01-25 18:57) [12]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));
Не на какие мысли не наводит? ;-)
← →
pasha_golub © (2005-01-25 19:22) [13]jack128 © (25.01.05 18:57) [12]
Ну че ты издеваешься? Человек задал конкретный вопрос, хочет услышать конкретный ответ. А ты тут загадками... ;-)
← →
infom © (2005-01-26 11:57) [14]jack128 © (25.01.05 18:57) [12]
извините что-то я про то, что переменная Size типа integer совсем не подумал
← →
Erik1 © (2005-01-26 12:14) [15]Зря тебе код дали. Знаеш что такое заголовок? Вот и сделай его фиксированого размера, в нем и опиши название потока, начало потока, размер потока.
← →
infom © (2005-01-26 12:40) [16]Erik1 © (26.01.05 12:14) [15]
В принципе я так сейчас и стараюсь что-то сделать, пока не далеко ушёл, но и на этом спасибо
← →
infom © (2005-01-26 13:00) [17]jack128 © (22.01.05 17:03) [3]
а этот код массив из двух потоков размером в 22 кб и 12 кб засовывает в поток размером 24 кб !
← →
jack128 © (2005-01-26 13:29) [18]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 14:19) [19]jack128 © (26.01.05 13:29) [18]
Спасибо я сам разобрался !
← →
infom © (2005-01-26 14:25) [20]А вот ещё вопрос....
У меня есть tADOQuery с данными, каким образом его можно сохранить в поток, у tADOQuery есть только SaveToFile а возможности использовать жесткий диск нет ?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.02.06;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c