c++ 讀寫複合文件簡單例子

建立個MFC的簡單功能來調用如下接口

void testWrite()
{
	// TODO: Add your control notification handler code here
	const unsigned short *FILENAME = L"c:\\test.stg";
	DWORD dwMode=STGM_WRITE|STGM_CREATE|STGM_SHARE_EXCLUSIVE;	// 只寫|若是文件存在則替換,不存在則建立|獨佔
	IStorage *pStgRoot,*pStgSub;
	IStream *pStream;
	pStgRoot=NULL;	// 設爲NULL,能夠知道函數是否執行成功
	////////////////////////////////////////////////////////////////////////////////
	// 建立複合文檔
	// 若是文件不存在則建立一個新文件,已經存在則替換原文件
	// 建立完成後獲得一個新的storage對象,可用於建立一個根目錄
	StgCreateDocfile(
		FILENAME,	// 複合文檔路徑
		dwMode,	// 請問模式
		0,	// 必須爲0
		&pStgRoot	// 返回一個新的storage對象
		);
	////////////////////////////////////////////////////////////////////////////////
	// 建立一個根目錄,並準備建立一個子目錄
	pStgRoot->CreateStorage(
		L"StgRoot",	// 子IStorage的名稱
		dwMode,	// 請問模式
		0,	// 必須爲0
		0,	// 必須爲0
		&pStgSub	// 返回一個新的storage對象
		);
	////////////////////////////////////////////////////////////////////////////////
	// 建立一個數據流(結點),並準備寫入數據
	pStgSub->CreateStream(
		L"Stm",	// 子IStream的名稱
		dwMode,	// 請問模式
		0,	// 必須爲0
		0,	// 必須爲0
		&pStream	// 返回一個新的IStream接口指針
		);
	////////////////////////////////////////////////////////////////////////////////
	// 寫入數據
	char strText[]={"Hello World2!"};
	ULONG actWrite;
	int nLen=strlen(strText);	// 字串長度
	pStream->Write(
		strText,	// 要寫入的數據
		nLen,	// 要寫入數據的長度
		&actWrite	// 實際寫入長度,也能夠設爲NULL
		);
	////////////////////////////////////////////////////////////////////////////////
	// 釋放資源
	// 若是不調用Release()方法,會致使寫入不徹底、文檔體積大、沒法正常讀取等問題
	pStream->Release();
	pStgSub->Release();
	pStgRoot->Release();
	////////////////////////////////////////////////////////////////////////////////
	CString strMsg;
	strMsg.Format("數據長度:%d , 實際寫入長度:%ld",nLen,actWrite);
	AfxMessageBox(strMsg);
	cout<<strMsg.GetBuffer(100)<<endl;
}

void testRead()
{
	DWORD dwMode=STGM_READ|STGM_SHARE_EXCLUSIVE;	// 只讀|獨佔
	const unsigned short *FILENAME = L"c:\\test.stg";
	IStorage *pStgRoot,*pStgSub;
	IStream *pStream;
	pStgRoot=NULL;
	pStgSub=NULL;
	pStream=NULL;
	////////////////////////////////////////////////////////////////////////////////
	// 打開文件
	StgOpenStorage(
		FILENAME,
		NULL,
		dwMode,
		NULL,
		0,
		&pStgRoot
		);
	////////////////////////////////////////////////////////////////////////////////
	// 打開一個目錄
	pStgRoot->OpenStorage(
		L"StgRoot",	// 注意大小寫
		NULL,
		dwMode,
		NULL,
		0,
		&pStgSub
		);
	////////////////////////////////////////////////////////////////////////////////
	// 準備讀取數據
	pStgSub->OpenStream(
		L"Stm",
		NULL,
		dwMode,
		0,
		&pStream
		);
	////////////////////////////////////////////////////////////////////////////////
	// 讀取數據
	const int nLen=255;	// 準備讀入的長度
	char strText[nLen]={0};	// 必須指定初始值,不然會顯示出亂碼,也能夠設爲 '\0'
	ULONG actRead;
	pStream->Read(
		strText,	// 存放放入的數據的緩衝區
		nLen,	// 要讀入數據的長度,如不清楚能夠設爲較大的數
		&actRead	// 實際讀入的長度
		);
	////////////////////////////////////////////////////////////////////////////////
	// 釋放資源
	pStream->Release();
	pStgSub->Release();
	pStgRoot->Release();
	////////////////////////////////////////////////////////////////////////////////
	AfxMessageBox(strText);
	CString strMsg;
	strMsg.Format("指定讀入數據的長度:%d , 實際讀入數據長度:%ld",nLen,actRead);
	AfxMessageBox(strMsg);
}
相關文章
相關標籤/搜索