结构化存储 根存储下的流 修改时间不正确?

时间:2021-11-15 12:30:43
只有根存储下的流时间不正确,  子存储的修改时间   和子存储下的流修改时间都正确。
显示如下:
结构化存储 根存储下的流 修改时间不正确?
测试代码如下:

void SampleCreateDoc();
void SampleEnum() ;
#include < atlconv.h > // ANSI、MBCS、UNICODE 转换
/////////////////////////////////////////////////////////////////////////////
using namespace std;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{

SampleCreateDoc();
SampleEnum();
return 0;
}


void SampleCreateDoc()
{
::CoInitialize(NULL); // COM 初始化
// 如果是MFC程序,可以使用AfxOleInit()替代

HRESULT hr; // 函数执行返回值
IStorage *pStg = NULL; // 根存储接口指针
IStorage *pSub = NULL; // 子存储接口指针
IStream *pStm = NULL; // 流接口指针
IStream *pSubStm =NULL;

hr = ::StgCreateDocfile( // 建立复合文件
L"a.stg", // 文件名称
STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE, // 打开方式
0, // 保留参数
&pStg); // 取得根存储接口指针
ASSERT( SUCCEEDED(hr) ); // 为了突出重点,简化程序结构,所以使用了断言。
// 在实际的程序中则要使用条件判断和异常处理

hr = pStg->CreateStream( // 建立流
L"Stm", // 流名称
STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE,
0,0,
&pStm); // 取得流接口指针
ASSERT( SUCCEEDED(hr) );

hr = pStm->Write( // 向流中写入数据
"Hello", // 数据地址
5, // 字节长度(注意,没有写入字符串结尾的\0)
NULL); // 不需要得到实际写入的字节长度
ASSERT( SUCCEEDED(hr) );

hr = pStg->CreateStorage( // 建立子存储
L"SubStg", // 子存储名称
STGM_CREATE | STGM_WRITE | STGM_SHARE_EXCLUSIVE,
0,0,
&pSub); // 取得子存储接口指针
ASSERT( SUCCEEDED(hr) );
hr = pSub->CreateStream(L"subStream", STGM_CREATE | STGM_WRITE|STGM_SHARE_EXCLUSIVE, 0,0, &pSubStm);
ASSERT(SUCCEEDED(hr));
pSubStm->Write("hello subStrem",10,NULL);
ASSERT(SUCCEEDED(hr));

if( pStm ) pStm->Release();// 释放流指针
if( pSub ) pSub->Release();// 释放子存储指针
if( pStg ) pStg->Release();// 释放根存储指针
if( pSubStm) pSubStm->Release();
::CoUninitialize(); // COM 释放
// 如果使用 AfxOleInit(),则不调用该函数
}

//////////////////////////////////////////////////////////////////////////


void SampleEnum() 
{ // 假设你已经做过 COM 初始化了

LPCTSTR lpFileName = _T( "a.stg" );
HRESULT hr;
IStorage *pStg = NULL;

USES_CONVERSION; // (注6)
LPCOLESTR lpwFileName = T2COLE( lpFileName ); // 转换T类型为宽字符
hr = ::StgIsStorageFile( lpwFileName ); // 是复合文件吗?
if( FAILED(hr) ) return;

hr = ::StgOpenStorage( // 打开复合文件
lpwFileName, // 文件名称
NULL,
STGM_READ | STGM_SHARE_DENY_WRITE,
0,
0,
&pStg); // 得到根存储接口指针

IEnumSTATSTG *pEnum=NULL; // 枚举器
hr = pStg->EnumElements( 0, NULL, 0, &pEnum );
ASSERT( SUCCEEDED(hr) );

STATSTG statstg;
while( NOERROR == pEnum->Next( 1, &statstg, NULL) )
{
// statstg.type 保存着对象类型 STGTY_STREAM 或 STGTY_STORAGE
// statstg.pwcsName 保存着对象名称
// ...... 还有时间,长度等很多信息。请查看 MSDN
int ncount = WideCharToMultiByte(CP_ACP, 0, statstg.pwcsName, -1, NULL, 0, NULL, FALSE);
char* temp7 = (char*)malloc(sizeof(char)*(ncount+1));
WideCharToMultiByte(CP_ACP, 0, statstg.pwcsName, -1, temp7, ncount, NULL, FALSE);

CString strTemp;
strTemp.Format("%s\t",temp7);
cout<<strTemp.GetBuffer(strTemp.GetLength());

CTime strTime(statstg.mtime);
strTemp.Format("%d年%d月%d日\n",strTime.GetYear(),strTime.GetMonth(),strTime.GetDay());
cout<<strTemp.GetBuffer(strTemp.GetLength())<<endl;
::CoTaskMemFree( statstg.pwcsName ); // 释放名称所使用的内存(注6)
free(temp7);
}

if( pEnum ) pEnum->Release();
if( pStg ) pStg->Release();
}

2 个解决方案

#1


人这么少。 结构化存储 根存储下的流 修改时间不正确?

#2


等高人出现。

#1


人这么少。 结构化存储 根存储下的流 修改时间不正确?

#2


等高人出现。