Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.06;
Скачать: CL | DM;

Вниз

Каким образом лучше сохранять несколько потоков в один файл ?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.046 c
4-1102871909
Дядя
2004-12-12 20:18
2005.02.06
Вольтметр через USB


4-1102977934
HydraMarat
2004-12-14 01:45
2005.02.06
Поймать данные Com-порта в основном потоке


1-1106730582
SashkoSoft
2005-01-26 12:09
2005.02.06
Достать ресурс из dll


14-1106053815
Шишкин Илья
2005-01-18 16:10
2005.02.06
Стеганография


6-1101564578
adagold
2004-11-27 17:09
2005.02.06
Проверка компьютера в сети