Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1106730895
s_ilnar
2005-01-26 12:14
2005.02.06
Считывание файлов в несколько потоков


3-1104996289
atruhin
2005-01-06 10:24
2005.02.06
Переход от IB 5.6 на FireBird 1.5


3-1105122869
6op9I
2005-01-07 21:34
2005.02.06
Имена баз, режим конструктора таблицы, визуальное создание связей


3-1105254096
XAdmin
2005-01-09 10:01
2005.02.06
GetCurrentRecord(PChar), обратное преобразование


14-1105964746
kai
2005-01-17 15:25
2005.02.06
печать в postscript





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский