![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Чтение и запись структуры данных в файл через TFileStream [D6, XP]
мух © (2005-09-19 13:36:00)Привет.
Задача. Нужно создать собраз каталога. Структура элемента каталога
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 14:47:00) [1]HEXO4YXA © (19.09.05 14:39) [5]
Ну уж тогда просто ShortString.
Было предложено. Результат неизвестен.
HEXO4YXA (2005-09-19 14:39:00) [2]да... чем тебе Name: string[127] не нравиться
мух (2005-09-19 14:10:00) [3]Ладно, спосибо большое...
Anatoly Podgoretsky (2005-09-19 14:04:00) [4]Пока не изменишь типа поля говорить не о чем. А если изменишь тип поля на фиксированый, то можно воспользоваться типизироваными файлами.
В случае записи переменных структур, не видать этого в твоем коде.
мух (2005-09-19 13:55:00) [5]Анатолий. Я пробовал по разному. В одном случае все замечательно писалось, но не читалось, а так вообще черте-что пишется. Я так понимаю, что при записи строки нужно писать еще и ее длину. Пробовал так: пишу сначала раздел длинн, потом данных. Длина строки определяется как 9, допустим. А пишется в файл только 8 символов из строки. Ну понятно, первый байт - длина строки. Тогда отподает необходимость писать длину, нужно только записать длина строки +1 байт. Пробую, но тогда читается как-то не так.
В общем, есть у кого-нить реальный пример записи в файл подобной структуры?
Anatoly Podgoretsky (2005-09-19 13:45:00) [6]И не получится, кроме конечно случая когда ты действительно хочешь записать указательн а строку, а не саму строку.
Измени это Name: string;