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

Вниз

Чтение и запись структуры данных в файл через TFileStream   Найти похожие ветки 

 
мух   (2005-09-19 13:36) [0]

Привет.
Задача. Нужно создать собраз каталога. Структура элемента каталога
 TFileInfo = record
   Directory: ShortString;
   Name: string;
   Size: integer;
   CreateDate: TFileTime;
   ModifyDate: TFileTime;
   OpenDate: TFileTime;
   Attr: integer;
   FileType: byte;
 end;


Тип TFileTime
 _FILETIME = record
   dwLowDateTime: DWORD;
   dwHighDateTime: DWORD;

Имею

TImageArray = array of TFileInfo;
FImageArray: TImageArray;


Нужно этот массив записать в файл, а потом считать.
Запись
var
 FileName: string;
 i: integer;
 tmp_stream: TFileStream;
 tmp_str: array[1..2] of string;
 tmp_int: array[1..4] of integer;
 tmp_card: array[1..6] of Cardinal;
 tmp_byte: byte;
begin
if PromptForFileName(FileName,Filter,DefaultExt,Title,InitialDir,SaveDialog) then
 begin
 tmp_stream:=TFileStream.Create(FileName,fmCreate or fmShareExclusive);
 tmp_int[1]:=length(FImageArray);
 tmp_stream.WriteBuffer(tmp_int[1],sizeof(integer));
 tmp_int[2]:=length(FFileMask);
 tmp_stream.WriteBuffer(tmp_int[2],sizeof(integer));
 tmp_stream.WriteBuffer(FFileMask,tmp_int[2]);
 for i:=0 to length(FImageArray)-1 do
   begin
     //запись блока данных
     tmp_str[1]:=FImageArray[i].Directory;
     tmp_stream.WriteBuffer(tmp_str[1],length(tmp_str[1]));

     tmp_str[2]:=FImageArray[i].Name;
     tmp_stream.WriteBuffer(tmp_str[2],length(tmp_str[2]));

     tmp_int[3]:=FImageArray[i].Size;
     tmp_stream.WriteBuffer(tmp_int[3],sizeof(integer));

     tmp_card[1]:=FImageArray[i].CreateDate.dwLowDateTime;
     tmp_card[2]:=FImageArray[i].CreateDate.dwHighDateTime;
     tmp_stream.WriteBuffer(tmp_card[1],sizeof(cardinal));
     tmp_stream.WriteBuffer(tmp_card[2],sizeof(cardinal));

     tmp_card[3]:=FImageArray[i].ModifyDate.dwLowDateTime;
     tmp_card[4]:=FImageArray[i].ModifyDate.dwHighDateTime;
     tmp_stream.WriteBuffer(tmp_card[3],sizeof(cardinal));
     tmp_stream.WriteBuffer(tmp_card[4],sizeof(cardinal));

     tmp_card[5]:=FImageArray[i].OpenDate.dwLowDateTime;
     tmp_card[6]:=FImageArray[i].OpenDate.dwHighDateTime;
     tmp_stream.WriteBuffer(tmp_card[5],sizeof(cardinal));
     tmp_stream.WriteBuffer(tmp_card[6],sizeof(cardinal));

     tmp_int[4]:=FImageArray[i].Attr;
     tmp_stream.WriteBuffer(tmp_int[4],sizeof(integer));

     tmp_byte:=FImageArray[i].FileType;
     tmp_stream.WriteBuffer(tmp_byte,sizeof(Byte));
   end;
 tmp_stream.Free;
 end;

Чтение
var
 FileName: string;
 i: integer;
 tmp_stream: TFileStream;
 tmp_str: array[1..2] of string;
 tmp_int: array[1..4] of integer;
 tmp_card: array[1..6] of Cardinal;
 tmp_byte: byte;
begin
if PromptForFileName(FileName,Filter,DefaultExt,Title,InitialDir,SaveDialog) then
 begin
 SetLength(FImageArray,0);
 FreeMem(FImageArray);
 tmp_stream:=TFileStream.Create(FileName,fmOpenRead or fmShareExclusive);

 //размер массива
 tmp_stream.ReadBuffer(tmp_int[1],sizeof(integer));

 tmp_stream.ReadBuffer(tmp_int[2],sizeof(integer));
 tmp_stream.ReadBuffer(FFileMask,tmp_int[2]);

 SetLength(FImageArray,tmp_int[1]);
 for i:=0 to tmp_int[1]-1 do
   begin
     //чтение блока данных
     tmp_stream.ReadBuffer(tmp_str[1],length(tmp_str[1]));
     tmp_str[1]:=FImageArray[i].Directory;

     tmp_str[2]:=FImageArray[i].Name;
     tmp_stream.WriteBuffer(tmp_str[2],length(tmp_str[2]));

     tmp_int[3]:=FImageArray[i].Size;
     tmp_stream.WriteBuffer(tmp_int[3],sizeof(integer));

     tmp_card[1]:=FImageArray[i].CreateDate.dwLowDateTime;
     tmp_card[2]:=FImageArray[i].CreateDate.dwHighDateTime;
     tmp_stream.WriteBuffer(tmp_card[1],sizeof(cardinal));
     tmp_stream.WriteBuffer(tmp_card[2],sizeof(cardinal));

     tmp_card[3]:=FImageArray[i].ModifyDate.dwLowDateTime;
     tmp_card[4]:=FImageArray[i].ModifyDate.dwHighDateTime;
     tmp_stream.WriteBuffer(tmp_card[3],sizeof(cardinal));
     tmp_stream.WriteBuffer(tmp_card[4],sizeof(cardinal));

     tmp_card[5]:=FImageArray[i].OpenDate.dwLowDateTime;
     tmp_card[6]:=FImageArray[i].OpenDate.dwHighDateTime;
     tmp_stream.WriteBuffer(tmp_card[5],sizeof(cardinal));
     tmp_stream.WriteBuffer(tmp_card[6],sizeof(cardinal));

     tmp_int[4]:=FImageArray[i].Attr;
     tmp_stream.WriteBuffer(tmp_int[4],sizeof(integer));

     tmp_byte:=FImageArray[i].FileType;
     tmp_stream.WriteBuffer(tmp_byte,sizeof(Byte));
   end;
 tmp_stream.Free;
 end;


Не обращайте внимания на изврат. Это просто после 3-х часов мучений. Просто не получается нефига.


 
Anatoly Podgoretsky ©   (2005-09-19 13:45) [1]

И не получится, кроме конечно случая когда ты действительно хочешь записать указательн а строку, а не саму строку.
Измени это    Name: string;


 
мух   (2005-09-19 13:55) [2]

Анатолий. Я пробовал по разному. В одном случае все замечательно писалось, но не читалось, а так вообще черте-что пишется. Я так понимаю, что при записи строки нужно писать еще и ее длину. Пробовал так: пишу сначала раздел длинн, потом данных. Длина строки определяется как 9, допустим. А пишется в файл только 8 символов из строки. Ну понятно, первый байт - длина строки. Тогда отподает необходимость писать длину, нужно только записать длина строки +1 байт. Пробую, но тогда читается как-то не так.
В общем, есть у кого-нить реальный пример записи в файл подобной структуры?


 
Anatoly Podgoretsky ©   (2005-09-19 14:04) [3]

Пока не изменишь типа поля говорить не о чем. А если изменишь тип поля на фиксированый, то можно воспользоваться типизироваными файлами.
В случае записи переменных структур, не видать этого в твоем коде.


 
мух   (2005-09-19 14:10) [4]

Ладно, спосибо большое...


 
HEXO4YXA ©   (2005-09-19 14:39) [5]

да... чем тебе Name: string[127] не нравиться


 
Anatoly Podgoretsky ©   (2005-09-19 14:47) [6]

HEXO4YXA ©   (19.09.05 14:39) [5]
Ну уж тогда просто ShortString.
Было предложено. Результат неизвестен.



Страницы: 1 вся ветка

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.037 c
2-1126615595
календарь1
2005-09-13 16:46
2005.10.16
Вопрос по датам


2-1127321877
RiP
2005-09-21 20:57
2005.10.16
Как из строковой переменой посимвольно считать в массив типа real


6-1119465288
bugman
2005-06-22 22:34
2005.10.16
UDP Redirect, port mapping, TidMappedPortUDP


3-1125509016
Гость22
2005-08-31 21:23
2005.10.16
Как создать алиас БД Парадокс в пользователя?


2-1126707473
Anton22
2005-09-14 18:17
2005.10.16
StatusBar