![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Стоит задача организовать хранение данных в одном файле. Данные имеют следующую структуру:
id - уникальный номер объекта object - jpeg или bmp изображение description - тестовое описание Каким образом лучше всего организовать хранение такой структуры данных, чтобы все содержалось в одном файле и работало более менее быстро? |
|
#2
|
|||
|
|||
|
Например, использовать встраиваемую БД. Я для таких задач использую Embedded FireBird.
|
|
#3
|
|||
|
|||
|
Ну, примитивный способ - использовать записи:
type TData = record id : integer; description : string[255]; picture : array [1..1024,1..768] of integer; end; На лицо сразу куча недостатков, некоторая ограниченность метода и избыточность размера файлов. Лучше всего конечно использовать базу данных, но если это по какой-либо причине нельзя делать, выход - использовать механихм blockread и blockwrite с обычными file of byte, записывая в файл информацию побайтово, кусками, сначала Id, затем описание, затем саму картинку, но так как размер описания и картинки может быть разным, лучше еще и их размер указывать. Также придется выделить область в файле для индека - чтоб выборку делать быстро, а не перебирать все варианты. |
|
#4
|
||||
|
||||
|
Цитата:
Последний раз редактировалось Страдалецъ, 21.08.2009 в 13:04. |
|
#5
|
|||
|
|||
|
Как вариант, есть еще и это :
Doc-файлы («DocFiles», «compound file», «составной файл», «хранилища структурированной информации», «structured storage») – средство для хранения структурированной информации в виде единого файла. Структура файла построена в виде дерева по аналогии с файловой системой. При этом, эквивалентом каталога(папки) является хранилище(storage), а эквивалентом файла – поток(stream). Doc-файлы ориентированы на хранение разнородных данных (текст, видео, графика, звук и т.д.). Этот формат используется в MS Office (Word, Excel, PowerPoint). Примерно так (открыть файл и отобразить в TTreeView) : Код:
procedure TForm1.Button1Click(Sender: TObject);
Var
Node : TTreeNode;
stgRoot: IStorage;
begin
OD1.FileName:=fn_1Cv7_md;
OD1.InitialDir:=ExtractFilePath(fn_1Cv7_md);
if OD1.Execute then begin
fn_1Cv7_md:=OD1.FileName;
Caption:=fn_1Cv7_md;
if StgIsStorageFile(PWideChar(fn_1Cv7_md))=S_OK then begin
//ShowMessage(ExtractFileName(fn_1Cv7_md)+' - это Doc-файл');
OleCheck(StgOpenStorage(PWideChar(fn_1Cv7_md),
nil,
stgm_read or stgm_share_exclusive,
nil,
0,
stgRoot));
TreeView1.Items.BeginUpdate;
try
TreeView1.Items.Clear;
Node:=TreeView1.Items.Add(nil,'<Root>');
GetNextStorage(Node,stgRoot);
Node.Expand(true);
finally
TreeView1.Items.EndUpdate;
stgRoot:=nil;
end;
end
else begin
ShowMessage(ExtractFileName(fn_1Cv7_md)+' - это не Doc-файл');
end;
end;
end;
procedure TForm1.GetNextStorage(pn : TTreeNode; stg : IStorage);
Var
ESS : IEnumStatStg;
StatStg : TStatStg;
NodeName : string;
cn : TTreeNode;
ctgChild : IStorage;
Sx : string;
begin
OleCheck(stg.EnumElements(0,nil,0,ESS));
while ESS.Next(1,StatStg,nil) = S_OK do
begin
NodeName:=StatStg.pwcsName;
Sx:='???';
if StatStg.dwType = STGTY_STORAGE then Sx:='STORAGE';
if StatStg.dwType = STGTY_STREAM then Sx:='STREAM';
if StatStg.dwType = STGTY_PROPERTY then Sx:='PROPERTY';
if StatStg.dwType = STGTY_LOCKBYTES then Sx:='LOCKBYTES';
cn:=TreeView1.Items.AddChild(pn,NodeName+'='+Sx+'');
if (StatStg.dwType = STGTY_STORAGE) then begin
OleCheck(Stg.OpenStorage(StatStg.pwcsName,
nil,
stgm_read or stgm_share_exclusive,
nil,
0,
ctgChild));
GetNextStorage(cn,ctgChild);
end;
end;
end; |