Как вариант, есть еще и это :
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;