网上有很多资料管理软件将所有的数据都有顺序的存储了一个文件中如果某天的资料包含有:文本文件 JPEG图片 Mp3文件 ........可以包含所有任意文件
每个文件都有一个id
程序运行时会读出所有文件的id
当双击ID时(比如显示在TreeCtrl中)
会用相应的软件打开对应的文件(如:如果装了winamp双击.mp3文件的ID时会用winamp播放文件)这些文件都是存储在一个大文件中的这些数据是怎么存储的?你们做过相关东东吗?
给我点意见有源码吗?只要源码够好,我还有几百分全给你
为了解决问题,参与就有分
每个文件都有一个id
程序运行时会读出所有文件的id
当双击ID时(比如显示在TreeCtrl中)
会用相应的软件打开对应的文件(如:如果装了winamp双击.mp3文件的ID时会用winamp播放文件)这些文件都是存储在一个大文件中的这些数据是怎么存储的?你们做过相关东东吗?
给我点意见有源码吗?只要源码够好,我还有几百分全给你
为了解决问题,参与就有分
CTreeCtrl控件
这个条件为什么不起作用?虽然编译没有错BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
NMHDR *pHdr = (NMHDR*)lParam;
if(pHdr->idFrom==0x1005 && wParam==NM_RCLICK)
{
AfxMessageBox("aaa"); }
return CFrameWnd::OnNotify(wParam, lParam, pResult);
}wParam==NM_RCLICK这个条件不起作用=============================================================
上面的数据是如何存储的?
https://sourceforge.net/projects/sevenzip/源代码、程序都有,楼主自己下吧,就是实现了你要的功能
BOOL CMainFrame::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
// TODO: Add your specialized code here and/or call the base class
NMHDR *pHdr = (NMHDR*)lParam;
if(pHdr->idFrom==0x1005)
{
AfxMessageBox("ID"); }
if(wParam==NM_RCLICK)
{
AfxMessageBox("MSG"); }
return CFrameWnd::OnNotify(wParam, lParam, pResult);
}
Office 的文件便是基于结构化存储的
To build:
// cl /GX WriteRead.cpp
//
//+============================================================================
#define WIN32_LEAN_AND_MEAN
#define UNICODE
#define _UNICODE#include <stdio.h>
#include <windows.h>
#include <ole2.h>// Implicitly link ole32.dll
#pragma comment( lib, "ole32.lib" )
// From uuidgen.exe:
const FMTID fmtid = { /* d170df2e-1117-11d2-aa01-00805ffe11b8 */
0xd170df2e,
0x1117,
0x11d2,
{0xaa, 0x01, 0x00, 0x80, 0x5f, 0xfe, 0x11, 0xb8}
};
EXTERN_C void wmain()
{
HRESULT hr = S_OK;
IPropertySetStorage *pPropSetStg = NULL;
IPropertyStorage *pPropStg = NULL;
WCHAR *pwszError = L""; try
{ // Create a file and a property set within it. hr = StgCreateStorageEx( L"WriteRead.stg",
STGM_CREATE|STGM_SHARE_EXCLUSIVE|STGM_READWRITE,
STGFMT_STORAGE,
// STGFMT_STORAGE => Structured Storage property sets
// STGFMT_FILE => NTFS file system property sets
0, NULL, NULL,
IID_IPropertySetStorage,
reinterpret_cast<void**>(&pPropSetStg) );
if( FAILED(hr) ) throw L"Failed StgCreateStorageEx"; hr = pPropSetStg->Create( fmtid, NULL, PROPSETFLAG_DEFAULT,
STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE,
&pPropStg );
if( FAILED(hr) ) throw L"Failed IPropertySetStorage::Create"; // Write a Unicode string property to the property set propspec.ulKind = PRSPEC_LPWSTR;
propspec.lpwstr = L"Property Name"; propvarWrite.vt = VT_LPWSTR;
propvarWrite.pwszVal = L"Property Value"; hr = pPropStg->WriteMultiple( 1, &propspec, &propvarWrite, PID_FIRST_USABLE );
if( FAILED(hr) ) throw L"Failed IPropertyStorage::WriteMultiple"; // It's not required, but give the property set a friendly name. PROPID propidDictionary = PID_DICTIONARY;
WCHAR *pwszFriendlyName = L"Write/Read Properties Sample Property Set";
hr = pPropStg->WritePropertyNames( 1, &propidDictionary, &pwszFriendlyName );
if( FAILED(hr) ) throw L"Failed IPropertyStorage::WritePropertyNames"; // Close and reopen everything.
// By using the STGFMT_ANY flag in the StgOpenStorageEx call,
// it doesn't matter if this is a Structured Storage property
// set or an NTFS file system property set (see the StgCreateStorageEx call
// above). pPropStg->Release(); pPropStg = NULL;
pPropSetStg->Release(); pPropSetStg = NULL; hr = StgOpenStorageEx( L"WriteRead.stg",
STGM_READ|STGM_SHARE_DENY_WRITE,
STGFMT_ANY,
0, NULL, NULL,
IID_IPropertySetStorage,
reinterpret_cast<void**>(&pPropSetStg) );
if( FAILED(hr) ) throw L"Failed StgOpenStorageEx"; hr = pPropSetStg->Open( fmtid, STGM_READ|STGM_SHARE_EXCLUSIVE,
&pPropStg );
if( FAILED(hr) ) throw L"Failed IPropertySetStorage::Open"; // Read the property back and validate it hr = pPropStg->ReadMultiple( 1, &propspec, &propvarRead );
if( FAILED(hr) ) throw L"Failed IPropertyStorage::ReadMultiple"; if( S_FALSE == hr )
throw L"Property didn't exist after reopening the property set";
else if( propvarWrite.vt != propvarRead.vt )
throw L"Property types didn't match after reopening the property set";
else if( 0 != wcscmp( propvarWrite.pwszVal, propvarRead.pwszVal ))
throw L"Property values didn't match after reopening the property set";
else
wprintf( L"Success\n" ); }
catch( const WCHAR *pwszError )
{
wprintf( L"Error: %s (hr=%08x)\n", pwszError, hr );
} PropVariantClear( &propvarRead );
if( pPropStg ) pPropStg->Release();
if( pPropSetStg ) pPropSetStg->Release();}
https://sourceforge.net/projects/sevenzip/
高难
ms-help://MS.MSDNQTR.2003APR.1033/stg/stg/enumall_sample.htm
--------------
>使用结构化存储,通过结构化存储可以象访问一个目录一样访问一个文件这是正解,速度还是蛮不错的。artmouse(艺术老鼠)
-----------------------
>别的我不知道,但是我觉得xml可以这样存文件,对于二进制的,编码为base64如果内容不多,文件不大,此法也不错,简单便捷。
还可以用INI文件保存更简单些。