Share via


IStorage-Compound檔案實作

IStorage的複合檔案實作可讓您建立和管理位於複合檔案物件之儲存體物件內的子儲存體和資料流程。 若要建立複合檔案物件並取得 IStorage 指標,請呼叫 API 函式 StgCreateStorageEx。 若要開啟現有的複合檔案物件並取得其根 IStorage 指標,請呼叫 StgOpenStorageEx

使用複合儲存體的應用程式應該在 HKEY_CLASSES_ROOT\SystemFileAssociations 中註冊,而且應該提供自己的屬性處理常式。 如需詳細資訊,請參閱 應用程式註冊的一節。

使用時機

大部分的應用程式都會使用此實作來建立和管理儲存體和資料流程。

方法

IStorage::CreateStream

建立並開啟包含在此儲存體物件中指定名稱的資料流程物件。 名稱長度不能超過 31 個字元, (不包含字串結束字元) 。 OLE 保留 000 到 01f 字元作為資料流程/儲存體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。 IStorage::CreateStream方法的 COM 提供的複合檔案實作不支援下列行為:

  • 不支援STGM_DELETEONRELEASE旗標。
  • 資料流程物件不支援交易模式 (STGM_TRANSACTED) 。
  • 不支援從相同的儲存體開啟相同資料流程一次以上。 STGM_SHARE_EXCLUSIVE共用模式旗標必須在 grfMode 參數中指定。

IStorage::OpenStream

使用 grfMode 參數中指定的存取模式,在此儲存物件內開啟現有的資料流程物件。 OLE 保留 000 到 01f 字元作為資料流程/儲存體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。 IStorage::OpenStream方法的 COM 提供的複合檔案實作不支援下列行為:

  • STGM_DELETEONRELEASE旗標。
  • 資料流程物件的交易模式 (STGM_TRANSACTED) 。
  • 從相同的儲存體開啟相同資料流程一次以上。 必須指定STGM_SHARE_EXCLUSIVE旗標。

IStorage::CreateStorage

在指定的存取模式中,建立並開啟具有指定名稱的新儲存物件。 名稱長度不能超過 31 個字元, (不包含字串結束字元) 。 OLE 保留 000 到 01f 字元作為資料流程/儲存體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。 IStorage::CreateStorage方法的 COM 提供的複合檔案實作不支援下列行為:

  • 非根儲存體的STGM_PRIORITY旗標。
  • 從相同的父儲存體開啟相同儲存物件一次以上。 必須指定STGM_SHARE_EXCLUSIVE旗標。
  • STGM_DELETEONRELEASE旗標。 如果指定此旗標,函式會傳回STG_E_INVALIDFLAG。

IStorage::OpenStorage

在指定的存取模式中,開啟具有指定名稱的現有儲存物件。 OLE 保留 000 到 01f 字元作為資料流程/儲存體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。 IStorage::OpenStorage方法的 COM 提供的複合檔案實作不支援下列行為:

  • 非根儲存體的STGM_PRIORITY旗標。
  • 從相同的父儲存體開啟相同儲存物件一次以上。 必須指定STGM_SHARE_EXCLUSIVE旗標。
  • STGM_DELETEONRELEASE旗標。 如果指定此旗標,函式會傳回STG_E_INVALIDFUNCTION。

IStorage::CopyTo

只會將這個開啟儲存物件的子儲存體和資料流程複製到另一個儲存物件。 rgiidExclude參數可以設定為IID_IStream只複製子儲存體,或IID_IStorage只複製資料流程。

IStorage::MoveElementTo

複製或移動子儲存體或資料流程,從這個儲存物件複製到另一個儲存物件。

IStorage::Commit

確保對在交易模式中開啟的儲存體物件所做的任何變更都反映在父儲存體中;針對根儲存體,反映實際裝置中的變更;例如,磁片上的檔案。 對於以直接模式開啟的根儲存體物件,除了將所有記憶體緩衝區排清到磁片之外,此方法沒有作用。 對於直接模式中的非根儲存體物件,這個方法沒有任何作用。

除非 在 grfCommitFlags 參數中指定STGC_OVERWRITE,否則 COM 提供的複合檔案實作會使用兩階段認可程式。 此雙階段程式可確保資料健全性,以防認可作業失敗。 首先,所有新資料都會寫入基礎檔案中未使用的空間。 如有必要,會將新的空間配置給檔案。 完成此步驟之後,檔案中的資料表會使用單一磁區寫入作業來更新,以指出新資料是用來取代舊資料。 舊資料會變成下一個認可作業時要使用的可用空間。 因此,如果認可變更時發生錯誤,則可以還原舊的資料。 如果指定STGC_OVERWRITE,則會使用單一階段認可作業。 如需交易模式旗標的詳細資訊,請參閱 STGC 列舉。

IStorage::Revert

捨棄自上次認可作業以來對儲存體物件所做的所有變更。

IStorage::EnumElements

建立並擷取列舉值物件的指標,此物件可用來列舉此儲存物件中包含的儲存和資料流程物件。 COM 提供的複合檔案實作會擷取該資訊的快照集。 因此,在取得新的列舉值之前,資料流程和儲存體的變更不會反映在列舉值中。

IStorage::D estroyElement

從這個儲存體物件中移除指定的專案 (子儲存體或資料流程) 。

IStorage::RenameElement

重新命名這個儲存體物件中指定的子儲存體或資料流程。 OLE 保留 000 到 01f 字元作為資料流程/儲存體名稱的第一個字元。 這是複合檔案限制,而不是結構化儲存限制。

IStorage::SetElementTimes

設定指定之儲存專案的修改、存取和建立時間。 COM 提供的複合檔案實作會維護內部儲存物件的修改和變更時間。 根儲存體物件支援基礎檔案系統 (或 ILockBytes) 支援的任何專案。 複合檔案實作不會維護內部資料流程的任何時間戳記。 不支援的時間戳記會回報為零,這可讓呼叫端測試支援。

IStorage::SetClass

將指定的 CLSID 指派給這個儲存物件。

IStorage::SetStateBits

儲存此儲存體物件中最多 32 位的狀態資訊。 這個方法所設定的狀態僅供外部使用。 COM 提供的複合檔案實作不會根據狀態執行任何動作。

IStorage::Stat

擷取這個開啟儲存物件的 STATSTG 結構。

備註

如果儲存體物件是以簡單模式開啟,則會限制使用上述方法。 如果儲存體是以StgCreateStorageExStgOpenStorageEx函式的grfMode參數中指定的STGM_SIMPLE元素開啟,則儲存體處於簡單模式。 如需簡單模式儲存體的詳細資訊,請參閱 STGM 常數。 如果從 StgCreateStorageEx 函式取得簡單模式儲存物件,則可以呼叫 CreateStream 方法,但 OpenStream 方法無法呼叫。 如果從 StgOpenStorageEx 函式取得簡單模式儲存物件,則可以呼叫 OpenStream 方法,但 CreateStream 方法無法呼叫。

當使用簡單模式儲存物件來建立資料流程時,該資料流程的大小下限通常是 4096 個位元組。 如果寫入資料流程的資料較少,大小會四捨五入為 4096 個位元組。

複合檔案實作限制

IFillLockBytes

ILockBytes

IRootStorage

IStorage

IStream

StgCreateDocfile

StgCreateStorageEx

StgOpenStorage

StgOpenStorageEx