![]() |
|
|
Регистрация | << Правила форума >> | 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; |