ReadWrite.cpp
上传用户:biuytresa
上传日期:2007-12-07
资源大小:721k
文件大小:6k
源码类别:

DNA

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "ReadWrite.h"
  3. #include "TextComp.h"
  4. CLSID g_clsid; // for the Text Component
  5. int g_nLevel = 0;
  6. UINT ReadThreadProc(const char* g_szRootStorageName);
  7. void ReadStorage(LPSTORAGE pStg);
  8. UINT WriteThreadProc(const char * g_szDirectionPathName, 
  9.  const char* g_szRootStorageName);
  10. void ReadDirectory(const char* szPath, LPSTORAGE pStg);
  11. UINT ReadThreadProc(const char* g_szRootStorageName)
  12. {
  13.     USES_CONVERSION;
  14. g_nLevel = 0;
  15. ::CLSIDFromProgID(L"Text.Object", &g_clsid);
  16. LPSTORAGE pStgRoot = NULL;
  17. if(::StgOpenStorage(T2COLE(g_szRootStorageName), NULL,
  18.                     STGM_READ|STGM_SHARE_EXCLUSIVE,
  19.             NULL, 0, &pStgRoot) == S_OK) {
  20. ASSERT(pStgRoot!= NULL);
  21. ReadStorage(pStgRoot);
  22. pStgRoot->Release();
  23. }
  24. else {
  25. AfxMessageBox("Storage file not available or not readable");
  26. }
  27. AfxMessageBox("Read complete");
  28. return 0;
  29. }
  30. // reads one storage -- recursive calls for substorages
  31. void ReadStorage(LPSTORAGE pStg)
  32. {
  33.     LPSTORAGE pSubStg = NULL;
  34.     LPSTREAM pStream = NULL;
  35.     LPENUMSTATSTG pEnum = NULL;
  36.     STATSTG statstg;
  37.     LPPERSISTSTREAM pPersistStream = NULL;
  38. g_nLevel++;
  39. if(pStg->EnumElements(0, NULL, 0, &pEnum) != NOERROR) {
  40. ASSERT(FALSE);
  41. return;
  42. }
  43. while(pEnum->Next(1, &statstg, NULL) == NOERROR) {
  44. if(statstg.type == STGTY_STORAGE) {
  45. VERIFY(pStg->OpenStorage(statstg.pwcsName, NULL,
  46.    STGM_READ|STGM_SHARE_EXCLUSIVE,
  47.    NULL, 0, &pSubStg) == S_OK);
  48. ASSERT(pSubStg != NULL);
  49. ReadStorage(pSubStg);
  50. pSubStg->Release();
  51. }
  52. else if(statstg.type == STGTY_STREAM) {
  53. VERIFY(pStg->OpenStream(statstg.pwcsName, NULL,
  54.    STGM_READ|STGM_SHARE_EXCLUSIVE,
  55.    0, &pStream) == S_OK);
  56. ASSERT(pStream != NULL);
  57. ITextObject textObject;
  58. VERIFY(textObject.CreateDispatch(g_clsid));
  59. textObject.m_lpDispatch->QueryInterface(IID_IPersistStream, 
  60. (void**) &pPersistStream);
  61. ASSERT(pPersistStream != NULL);
  62. pPersistStream->Load(pStream);
  63. pPersistStream->Release();
  64. COleVariant va = textObject.GetText();
  65. ASSERT(va.vt == VT_BSTR);
  66. CString str = va.bstrVal;
  67.      TRACE("%sn", str);
  68. pStream->Release();
  69. }
  70. else {
  71. ASSERT(FALSE);  // LockBytes?
  72. }
  73. ::CoTaskMemFree(statstg.pwcsName);
  74. }
  75. pEnum->Release();
  76. g_nLevel--;
  77. }
  78. UINT WriteThreadProc(const char * g_szDirectionPathName, 
  79.  const char* g_szRootStorageName)
  80. {
  81.     USES_CONVERSION;
  82.     LPSTORAGE pStgRoot = NULL;
  83.     g_nLevel = 0;
  84. ::CLSIDFromProgID(L"Text.Object", &g_clsid);
  85.     if (::StgCreateDocfile(T2COLE(g_szRootStorageName),
  86.            STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
  87.    0, &pStgRoot) != S_OK) 
  88. {
  89.     AfxMessageBox("Create DocFile Failed!");
  90. return -1;
  91. }
  92.     ReadDirectory(g_szDirectionPathName, pStgRoot);
  93.     pStgRoot->Release();
  94.     AfxMessageBox("Write Compound File Complete");
  95.     return 0;
  96. }
  97. // read one directory and write one storage 
  98. //      -- recursive calls for substorages
  99. void ReadDirectory(const char* szPath, LPSTORAGE pStg)
  100. {
  101.     USES_CONVERSION;
  102.     WIN32_FIND_DATA fData;
  103.     HANDLE h;
  104.     char szNewPath[MAX_PATH];
  105.     char szStorageName[100];
  106.     char szStreamName[100];
  107. char szData[512];
  108.     char* pch = NULL;
  109.     LPSTORAGE pSubStg = NULL;
  110.     LPSTREAM pStream = NULL;
  111.     LPPERSISTSTREAM pPersistStream = NULL;
  112.     g_nLevel++;
  113.     strcpy(szNewPath, szPath);
  114.     strcat(szNewPath, "*.*");
  115.     h = ::FindFirstFile(szNewPath, &fData);
  116.     if (h == (HANDLE) 0xFFFFFFFF) return;  // can't find directory
  117.     do {
  118.       if (!strcmp(fData.cFileName, "..") ||
  119.           !strcmp(fData.cFileName, ".") ) continue;
  120.       while((pch = strchr(fData.cFileName, '!')) != NULL) 
  121.       {
  122.       *pch = '|';
  123.   }
  124.       if (fData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
  125. // It's a directory, so make a storage
  126.         strcpy(szNewPath, szPath);
  127.         strcat(szNewPath,fData.cFileName);
  128.         strcat(szNewPath, "\");
  129.         strcpy(szStorageName, fData.cFileName);
  130.         szStorageName[31] = '';
  131.         TRACE("%d -- sStorage = %sn", (g_nLevel - 1) * 4, szStorageName);
  132.         VERIFY(pStg->CreateStorage(T2COLE(szStorageName),
  133.                STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
  134.                0, 0, &pSubStg) == S_OK);
  135.         ASSERT(pSubStg != NULL);
  136.         ReadDirectory(szNewPath, pSubStg);
  137.         pSubStg->Release();
  138.       } 
  139.   else 
  140.   {
  141.         if ((pch = strrchr(fData.cFileName, '.')) != NULL) {
  142.           if (!stricmp(pch, ".txt")
  143.   ||!stricmp(pch, ".c")
  144.   ||!stricmp(pch, ".cpp")
  145.   ||!stricmp(pch, ".h")) {
  146. // It's a text file, so make a stream
  147. strcpy(szStreamName, fData.cFileName);
  148.             strcpy(szNewPath, szPath);
  149.             strcat(szNewPath, szStreamName);
  150.   szStreamName[32] = ''; // OLE max length
  151.             TRACE("%d -- sStream = %sn", (g_nLevel - 1) * 4, szNewPath);
  152. CStdioFile file(szNewPath, CFile::modeRead);
  153.             // Ignore zero-length files
  154. if(file.ReadString(szData, 511)) {
  155.               TRACE("%sn", szData);
  156.               VERIFY(pStg->CreateStream(T2COLE(szStreamName),
  157.                      STGM_CREATE | STGM_READWRITE | 
  158.        STGM_SHARE_EXCLUSIVE,
  159.                      0, 0, &pStream) == S_OK);
  160.               ASSERT(pStream != NULL);
  161.   // Include the null terminator in the stream
  162.   ITextObject textObject;
  163.   VERIFY(textObject.CreateDispatch(g_clsid));
  164.   textObject.m_lpDispatch->QueryInterface(IID_IPersistStream, 
  165.   (void**) &pPersistStream);
  166.   ASSERT(pPersistStream != NULL);
  167.   textObject.SetText(COleVariant(szData));
  168.   pPersistStream->Save(pStream, TRUE);
  169.   pPersistStream->Release();
  170.               pStream->Release();
  171.             }
  172.           }
  173.         }
  174.       }
  175.     } while (::FindNextFile(h, &fData));
  176.     g_nLevel--;
  177. }