none
請問如何使用vb.net or VB6.0寫入檔案的『摘要』 RRS feed

  • 問題

  •  

    請問如何使用vb.net or VB6.0寫入檔案的『摘要』

    即-->使用檔案總管->點選檔案->右鍵->內容->摘要
    裡面有
          標題
          主旨
          作者
          類別目錄
          關鍵字
          註解

    小弟新建一個文字,內容資料為 0 byte
    但是以檔案總管修正上述資料後內容資料不變(仍為 0 byte)

    不知道這些資訊是儲存於何處??

    可否使用程式直接更新(目前是使用檔案總管修正)??

    不知該vb.net是否有提供修改資訊的資料

    或是您可以提供相關的資料可供小弟參考???

    謝謝各位的幫忙

    2008年6月18日 上午 07:32

解答

  • 所有 Office 文檔從 Microsoft Office 6.0 開始都有摘要屬性工作表,您可以輸入標題、 主題和作者文檔以及其他合資格的資訊如類別、 關鍵字和意見
    在 Windows 2000 和 Windows ME 的所有此摘要資訊顯示在螢幕提示中。 但是,Windows 2000 或更新版本,進一步執行NTFS 檔案系統此一步驟,使您將附加到任何已註冊的檔案類型的摘要資訊。
    Windows 2000 就能夠做,因為NTFS 功能被稱為多資料流。 所有定義的物件傳遞給資料流程中 GUI。 FAT、 Fat 32 和 VFAT 檔案系統只為提供一個單個資料流程所以摘要資料要在檔中, 嵌入原樣與 Office 文檔,以上予以通過。 使用 NTFS,但是,其他資料可能將附加到另一個資料流程中的物件完全。 只要該檔從一個 NTFS 卷複製到另一個,有關繼續沿予以通過。 如果您從 NTFS 卷複製到非 NTFS 卷,但是,您將會警告其他資料流程中的資訊將會丟失。

    NTFS 檔案系統 5.0 提供 NTFS 卷上的檔的 IPropertySetStorage 介面的實現,當檔本身不復合檔。 IPropertySetStorage NTFS 實施獲取一個指標,我們要調用 StgCreateStorageEx 函數:

     

    Code Snippet
    function StgOpenStorageEx (
     const pwcsName : POleStr;  //Pointer to the path of the
                                //file containing storage object
     
    grfMode : LongInt;         //Specifies the access mode for the object
     
    stgfmt : DWORD;            //Specifies the storage file format
     
    grfAttrs : DWORD;          //Reserved; must be zero
     
    pStgOptions : Pointer;     //Address of STGOPTIONS pointer
     
    reserved2 : Pointer;       //Reserved; must be zero
     
    riid : PGUID;              //Specifies the GUID of the interface pointer
     
    out stgOpen :              //Address of an interface pointer
     
    IStorage ) : HResult; stdcall; external 'ole32.dll';

     

     

     

    The implementation of IPropertySetStorage on NTFS file system is similar with compound file implementation and available only on Windows 2000. Windows 95 and Windows NT 4.0 and earlier versions cannot access this interface.

    Code Snippet
    procedure SetFileSummaryInfo(const FileName : WideString);
    const
    FmtID_SummaryInformation: TGUID =     '{F29F85E0-4FF9-1068-AB91-08002B27B3D9}';
    FMTID_DocSummaryInformation : TGUID = '{D5CDD502-2E9C-101B-9397-08002B2CF9AE}';
    FMTID_UserDefinedProperties : TGUID = '{D5CDD505-2E9C-101B-9397-08002B2CF9AE}';
    IID_IPropertySetStorage : TGUID =     '{0000013A-0000-0000-C000-000000000046}';

    const
    STGFMT_FILE = 3; //Indicates that the file must not be a compound file.
                     //This element is only valid when using the StgCreateStorageEx
                     //or StgOpenStorageEx functions to access the NTFS file system
                     //implementation of the IPropertySetStorage interface.
                     //Therefore, these functions return an error if the riid
                     //parameter does not specify the IPropertySetStorage interface,
                     //or if the specified file is not located on an NTFS file system volume.

    STGFMT_ANY = 4; //Indicates that the system will determine the file type and
                    //use the appropriate structured storage or property set
                    //implementation.
                    //This value cannot be used with the StgCreateStorageEx function.


    // Summary Information
     
    PID_TITLE        = 2;
     PID_SUBJECT      = 3;
     PID_AUTHOR       = 4;
     PID_KEYWORDS     = 5;
     PID_COMMENTS     = 6;
     PID_TEMPLATE     = 7;
     PID_LASTAUTHOR   = 8;
     PID_REVNUMBER    = 9;
     PID_EDITTIME     = 10;
     PID_LASTPRINTED  = 11;
     PID_CREATE_DTM   = 12;
     PID_LASTSAVE_DTM = 13;
     PID_PAGECOUNT    = 14;
     PID_WORDCOUNT    = 15;
     PID_CHARCOUNT    = 16;
     PID_THUMBNAIL    = 17;
     PID_APPNAME      = 18;
     PID_SECURITY     = 19;

    var
     
    PropSetStg: IPropertySetStorage;
     PropSpec: array of TPropSpec;
     PropStg: IPropertyStorage;
     PropVariant: array of TPropVariant;
     Stg: IStorage;
    begin
     
    OleCheck(StgOpenStorageEx(PWideChar(FileName),
     STGM_SHARE_EXCLUSIVE or STGM_READWRITE,
     STGFMT_ANY,
     0, nilnil, @IID_IPropertySetStorage, stg));

     PropSetStg := Stg as IPropertySetStorage;

     OleCheck(PropSetStg.Create(FmtID_SummaryInformation, FmtID_SummaryInformation, PROPSETFLAG_DEFAULT,
     STGM_CREATE or STGM_READWRITE or STGM_SHARE_EXCLUSIVE, PropStg));

     Setlength(PropSpec,5);
     PropSpec[0].ulKind := PRSPEC_PROPID;
     PropSpec[0].propid := PID_AUTHOR;

     PropSpec[1].ulKind := PRSPEC_PROPID;
     PropSpec[1].propid := PID_TITLE;

     PropSpec[2].ulKind := PRSPEC_PROPID;
     PropSpec[2].propid := PID_SUBJECT;

     PropSpec[3].ulKind := PRSPEC_PROPID;
     PropSpec[3].propid := PID_KEYWORDS;

     PropSpec[4].ulKind := PRSPEC_PROPID;
     PropSpec[4].propid := PID_COMMENTS;

     SetLength(PropVariant,5);
     PropVariant[0].vt := VT_LPWSTR;
     PropVariant[0].pwszVal := 'Perevoznyk';

     PropVariant[1].vt := VT_LPWSTR;
     PropVariant[1].pwszVal := 'Delphi Demo Title';

     PropVariant[2].vt := VT_LPWSTR;
     PropVariant[2].pwszVal := 'NTFS Storage';

     PropVariant[3].vt := VT_LPWSTR;
     PropVariant[3].pwszVal := 'Delphi';

     PropVariant[4].vt := VT_LPWSTR;
     PropVariant[4].pwszVal := 'No Comments';

     OleCheck(PropStg.WriteMultiple(5, @PropSpec[0], @PropVariant[0], 2 ));
     PropStg.Commit(STGC_DEFAULT);
    end;

     

     

      If a specified property already exists, its value is replaced with the new  one, even when the old and new types for the property value are different. If the specified property does not already exist, that property is created.
    Property sets, not including the data for nonsimple properties, are limited to 256 KB in size for Windows NT 4.0 systems and earlier. For Windows 2000, Windows XP and Windows Server 2003 family, OLE property sets are limited to 1 MB. If these limits are exceeded, the operation fails and the caller receives an error message. There is no possibility of a memory leak or overrun.

    Download full source code for this article

    2008年11月7日 上午 07:30