Сразу хотелось бы предупредить о двух вещах: 1) для ВСЕХ файлов это будет работать только на NTFS (так как используются альтернативные потоки, чего не существует в ранних FS) 2) в других FS читаются свойства только compound-файлов (например файлов из пакетов MS-Office и MSI)
Извините этот пример я использовал но почемуто он не отображает сами надмиси в катологах. Например он пишет католог "Comment" а что в этом комменте он не пишет!
ПРОШУ ПОМОЧЬ!!!!!! Мне нужно чтобы отоброжалась сводка ауди например сколько то килобит в секунду и т.д!!
!
Не злоупотребляй размером текста! Это может привести к обратному результату, а не к тому, что ты ожидаешь!
Извините этот пример я использовал но почемуто он не отображает сами надмиси в катологах. Например он пишет католог "Comment" а что в этом комменте он не пишет!
А КАК именно ты его использовал - мы должны сами догадаться? Телепаты в отпуске! Исходник ПОЛНЫЙ присоединяй, посмотрим...
Цитата(Артемий @ 4.07.2006 15:20)
Мне нужно чтобы отоброжалась сводка ауди например сколько то килобит в секунду и т.д!!
А у тебя эти данные в файле хранятся? Файл какой? WAV/MP3/WMA/ ??? Файловая система какая?
type PPropSpecArray=^TPropSpecArray; // массив спецификаций св-в TPropSpecArray=array[0..999] of TPropSpec;
PPropVariantArray=^TPropVariantArray; // массив - приемник, куда будут помещены значения нужных св-в TPropVariantArray=array[0..999] of TPropVariant;
// вспомогательные ф-ции *******
function IsNTFS(AFileName : string) : boolean; var fso, drv : OleVariant; begin fso := CreateOleObject('Scripting.FileSystemObject'); drv := fso.GetDrive(fso.GetDriveName(AFileName)); Result:=drv.FileSystem = 'NTFS' end;
function FileTimeToLocalSystemTime(ft:FILETIME):TSystemTime; var t:FILETIME; begin FileTimeToLocalFileTime(ft,t); FileTimeToSystemTime(t,result); end;
function SysTimeToStr(ST : TSystemTime):string; begin SetLength(result,15); GetTimeFormat(LOCALE_USER_DEFAULT,0,@st,nil,@result[1],15); SetLength(result, StrLen(@result[1])); end;
function SysDateToStr(ST : TSystemTime) : string; begin SetLength(Result, 255); GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, @ST, nil, @result[1], 255); SetLength(Result, LStrLen(@result[1])); end;
function SysDateTimeToStr(ST:TSystemTime):string; begin result:=SysDateToStr(ST)+' '+SysTimeToStr(ST) end;
// *******
procedure TForm2.Button1Click(Sender: TObject); var stgRoot:IStorage; stgPS:IPropertySetStorage; stgP:IPropertyStorage; ps:PPropSpecArray; pv:PPropVariantArray; lit:TListItem; // значения св-в записываем в ListView begin
if (not OpenDialog1.Execute) then exit; // выбираем файл
// Проверяем: если это не compound file и система - не NTFS, тогда выходим. // (для compound файлов FS не важна) if (StgIsStorageFile(StringToOleStr(OpenDialog1.FileName))<>S_OK) then if (not IsNTFS(OpenDialog1.FileName)) then begin MessageBox(Handle,'NTFS needed for non-compound files','Error',MB_ICONERROR); exit; end;
ListView1.Clear;
if (StgOpenStorageEx(StringToOleStr(OpenDialog1.FileName), STGM_READ or STGM_SHARE_DENY_WRITE, STGFMT_ANY, 0, nil, nil, @IID_IPropertySetStorage, stgRoot)<>S_OK) then // открываем файл begin MessageBox(Handle,'Can not open file','Error',MB_ICONERROR); exit; end;
stgPS:=stgRoot as IPropertySetStorage; // ссылаемся на нужный интерфейс if (stgPS.Open(FMTID_SummaryInformation,STGM_READ or STGM_SHARE_EXCLUSIVE,stgP)<>S_OK) then begin // открываем набор св-в MessageBox(Handle,'Can not open property set','Error',MB_ICONERROR); exit; end;
ps[0].ulKind:=PRSPEC_PROPID; // считываем св-ва по их идентификатору (см. ActiveX.pas)
// Прочитаем несколько св-в файла. // В этом примере - для наглядности - читаем по одному св-ву из потока (можно за один раз прочитать и больше), // поэтому каждый раз значение будет лежать в pv[0].
ps[0].propid:=PIDSI_TITLE; // заголовок lit:=ListView1.Items.Add; lit.Caption:='Title'; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then // читаем св-во lit.SubItems.Add(pv[0].pszVal) // добавляем в ListView else lit.SubItems.Add('');
ps[0].propid:=PIDSI_SUBJECT; // тема lit:=ListView1.Items.Add; lit.Caption:='Subject'; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then lit.SubItems.Add(pv[0].pszVal) else lit.SubItems.Add('');
ps[0].propid:=PIDSI_AUTHOR; // автор lit:=ListView1.Items.Add; lit.Caption:='Author'; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then lit.SubItems.Add(pv[0].pszVal) else lit.SubItems.Add('');
ps[0].propid:=PIDSI_COMMENTS; // комментарий lit:=ListView1.Items.Add; lit.Caption:='Comment'; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then lit.SubItems.Add(pv[0].pszVal) else lit.SubItems.Add('');
ps[0].propid:=PIDSI_REVNUMBER; // номер редакции lit:=ListView1.Items.Add; lit.Caption:='Revision'; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then lit.SubItems.Add(pv[0].pszVal) else lit.SubItems.Add('');
ps[0].propid:=PIDSI_APPNAME; // приложение, создавшее пакет lit:=ListView1.Items.Add; lit.Caption:='Application'; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then lit.SubItems.Add(pv[0].pszVal) else lit.SubItems.Add('');
ps[0].propid:=PIDSI_CREATE_DTM; // Дата создания lit:=ListView1.Items.Add; lit.Caption:='Creation date'; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then lit.SubItems.Add(SysDateTimeToStr(FileTimeToLocalSystemTime(pv[0].filetime))) else lit.SubItems.Add('');
ps[0].propid:=PIDSI_WORDCOUNT; // кол-во слов в документе lit:=ListView1.Items.Add; lit.Caption:='Word count'; if (stgP.ReadMultiple(1, @ps[0], @pv[0])=S_OK) then lit.SubItems.Add(IntToStr(pv[0].lVal)) else lit.SubItems.Add('');
finally if assigned(ps) then FreeMem(ps); if assigned(pv) then FreeMem(pv); stgP:=nil; stgPS:=nil; stgRoot:=nil; end; end;
procedure TForm2.FormCreate(Sender: TObject); begin // добавим в список 2 столбца (лучше это делать в дизайнере) ListView1.ViewStyle:=vsReport; ListView1.Columns.Add.Caption:='Name'; ListView1.Columns.Add.Caption:='Value';
// добавим в диалог открытия несколько типов compound-файлов OpenDialog1.Filter:='All Files (*.*)|*.*|MS Office Documents (*.doc;*.xls;*.dot)|*.doc; *.xls; *.dot|MSI Databases (*.msi)|*.msi'; end;
Значит, вот немного подправленная версия программы, извлекающей содержимое вкладки Summary... Работает следующим образом: вначале проверяет, можно ли открыть так называемый Property Set. Если можно (т.е., если он существует в файле), то его содержимое отображается. Если программа не нашла в файле Property Set, то она пытается (по расширению файла, не по содержанию!!!) найти информацию о выбранном файле (для WAV отображается содержимое заголовка, если он соответствует критериям, для MP3 - содержимое тегов ID3v1)...