在永久存儲機(jī)制下,普通文件都是用字節(jié)組織的.每個文件都是沒有次序的字節(jié)組成的. 而整個文件則是一塊的形式存儲在磁盤中的,并且每個塊都是離散的.當(dāng)你要讀某個文件的時候文件系統(tǒng)會管理它的指針并返回要讀取的字節(jié)流.COM采用另一種更為合理的方法來存儲文件和數(shù)據(jù).這種方式就叫結(jié)構(gòu)化存儲.結(jié)構(gòu)化存儲采用的辦法是把文件預(yù)先加工后存儲在一個文檔結(jié)構(gòu)中.這里要使用兩個COM對象.storages和streams.storage對象很類似與文件系統(tǒng)中的目錄,它可以包含其它的storage對象和stream對象.你可以把 stream對象理解成文件系統(tǒng)中的文件.和文件一樣,stream對象包含數(shù)據(jù),stored 則象一個連續(xù)的字節(jié)塊.每一個復(fù)合文檔都包含以上兩個對象.COM通過兩個借口來訪問上面兩個對象IStorage和IStream.
為什么我們需要結(jié)構(gòu)化存儲? 是的,要知道你的復(fù)合文檔中包括,圖象,文字,等等其它一些數(shù)據(jù).好啦,現(xiàn)在你大概希望把它們放到一起去.以前的做法是當(dāng)你要保存文件的時候,文件系統(tǒng)會把原文件重寫從而把你的新的資料加入進(jìn)來.聽上去很花時間和精力是嗎?是的,所結(jié)構(gòu)化處理采用另外一個辦法.新的數(shù)據(jù)存儲到老的數(shù)據(jù)后面.是的就想文件系統(tǒng)那樣存放到新的文件夾那樣所不同的是它使用的是storage對象和stream對象.下面看看它給我們帶來了什么好處
1.結(jié)構(gòu)化存儲能夠讓你完全控制每一個獨(dú)立的對象,每次讀/寫你不必去讀寫整個文件,而可以讀/寫你想要的段落.
2.并且一個用戶可以并發(fā)的讀/寫同一個文件,復(fù)合文檔:就是把不同類型的數(shù)據(jù)存儲在一個文件中.如一個word文件可以包括excel的圖表,圖象表格,或者其它數(shù)據(jù).,現(xiàn)在讓我們來看它的兩個接口IStorage 接口,//考試大編注。
如你所想的那樣它就象文件系統(tǒng)中的目錄.
IStream 接口
它用來讀/寫數(shù)據(jù)到stream對象.
你可以到MSDN上查找到相應(yīng)的文檔.
最后讓我們舉個例子,來看看他們是如何工作的.
步驟如下:
1.首先要調(diào)用StgCreateDocfile函數(shù)來創(chuàng)建一個存儲根對象.我們的復(fù)合文件要 存儲每一個存儲對象和流對象.StgCreateDocfile函數(shù)返回一個IStorage接口指針
2.調(diào)用IStorage的CreateStream來創(chuàng)建一個流對象.該函數(shù)返回一個IStream的指針
3.最后調(diào)用IStream的wirte函數(shù)來寫如流.
源代碼如下:
#include
int main(int argc, char* argv[])
{
CoInitialize(NULL);
IStorage* pStr;
HRESULT hr = StgCreateDocfile( L\"test.mcb\", STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, &pStr);
IStream* pStream;
hr = pStr->CreateStream( L\"mcbStream\", STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &pStream );
ULONG name;
char data[] = \"Mahesh testing \" ;
pStream->Write( data, strlen(data), &name ) ;
CoUninitialize();
return 0;
}
為什么我們需要結(jié)構(gòu)化存儲? 是的,要知道你的復(fù)合文檔中包括,圖象,文字,等等其它一些數(shù)據(jù).好啦,現(xiàn)在你大概希望把它們放到一起去.以前的做法是當(dāng)你要保存文件的時候,文件系統(tǒng)會把原文件重寫從而把你的新的資料加入進(jìn)來.聽上去很花時間和精力是嗎?是的,所結(jié)構(gòu)化處理采用另外一個辦法.新的數(shù)據(jù)存儲到老的數(shù)據(jù)后面.是的就想文件系統(tǒng)那樣存放到新的文件夾那樣所不同的是它使用的是storage對象和stream對象.下面看看它給我們帶來了什么好處
1.結(jié)構(gòu)化存儲能夠讓你完全控制每一個獨(dú)立的對象,每次讀/寫你不必去讀寫整個文件,而可以讀/寫你想要的段落.
2.并且一個用戶可以并發(fā)的讀/寫同一個文件,復(fù)合文檔:就是把不同類型的數(shù)據(jù)存儲在一個文件中.如一個word文件可以包括excel的圖表,圖象表格,或者其它數(shù)據(jù).,現(xiàn)在讓我們來看它的兩個接口IStorage 接口,//考試大編注。
如你所想的那樣它就象文件系統(tǒng)中的目錄.
IStream 接口
它用來讀/寫數(shù)據(jù)到stream對象.
你可以到MSDN上查找到相應(yīng)的文檔.
最后讓我們舉個例子,來看看他們是如何工作的.
步驟如下:
1.首先要調(diào)用StgCreateDocfile函數(shù)來創(chuàng)建一個存儲根對象.我們的復(fù)合文件要 存儲每一個存儲對象和流對象.StgCreateDocfile函數(shù)返回一個IStorage接口指針
2.調(diào)用IStorage的CreateStream來創(chuàng)建一個流對象.該函數(shù)返回一個IStream的指針
3.最后調(diào)用IStream的wirte函數(shù)來寫如流.
源代碼如下:
#include
int main(int argc, char* argv[])
{
CoInitialize(NULL);
IStorage* pStr;
HRESULT hr = StgCreateDocfile( L\"test.mcb\", STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, NULL, &pStr);
IStream* pStream;
hr = pStr->CreateStream( L\"mcbStream\", STGM_DIRECT|STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE, 0, 0, &pStream );
ULONG name;
char data[] = \"Mahesh testing \" ;
pStream->Write( data, strlen(data), &name ) ;
CoUninitialize();
return 0;
}