Форум: "Начинающим";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
ВнизЧтение и запись структуры данных в файл через 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.04 c