makezip.c
上传用户:jlteech
上传日期:2007-01-06
资源大小:349k
文件大小:15k
源码类别:

压缩解压

开发平台:

Visual C++

  1. /*
  2.  Copyright (C) 1996 Mike White
  3.  Permission is granted to any individual or institution to use, copy, or
  4.  redistribute this software so long as all of the original files are included,
  5.  that it is not sold for profit, and that this copyright notice is retained.
  6. */
  7. #ifdef __BORLANDC__
  8. #include <dir.h>
  9. #endif
  10. #include <direct.h>
  11. #include <string.h>
  12. #include <io.h>
  13. #include <stdio.h>
  14. #include <ctype.h>
  15. #include <dos.h>
  16. #include <fcntl.h>
  17. #include <io.h>
  18. #include "wiz.h"
  19. #include "helpids.h"
  20. #ifndef WIN32
  21. #include <lzexpand.h>
  22. #endif
  23. /* Define size of read/write buffer for copying files */
  24. #define READ_WRITE_BUF 4096
  25. extern char **pszIndex;
  26. extern char *sz;
  27. extern LPSTR szFileList;
  28. extern HANDLE hFileList;
  29. extern int ZipRetCode;
  30. BOOL fMakeDosSFX;
  31. BOOL fMakeSFX;
  32. char szTempFileName[PATH_MAX];
  33. char szTargetName[PATH_MAX];
  34. static char szTargetFileName[PATH_MAX] = "";
  35. char __based(__segname("STRINGS_TEXT")) szTargetZipDir[PATH_MAX];
  36. char __based(__segname("STRINGS_TEXT")) szTargetZipFile[PATH_MAX] = "";
  37. char __based(__segname("STRINGS_TEXT")) szCantMakeZip[] =
  38.    "Internal error: Cannot make zip file. Common dialog error code is 0x%lX.";
  39. void MakeArchive(HWND hWnd)
  40. {
  41. char tempFileName[PATH_MAX], tempPath[PATH_MAX];
  42. /* temporary zip options flags */
  43. BOOL fVerbose,fForce,fSystem,fVolume,fNoDirEntries,fJunkDir,fCRLF_LF,
  44.      fLF_CRLF,fEncrypt,fRecurse,fMove,fLatestTime,fUpdate,fFreshen,
  45.      fQuiet,fComment,fmakesfx,fOffsets, fExtra;
  46. #ifdef WIN32
  47. BOOL fPrivilege, fdossfx;
  48. #endif
  49. char fLevel;
  50. int fRepair;
  51. #ifndef WIN32
  52.    FARPROC lpfnGetFilesProc;
  53. #endif
  54. /* Save zip options flags */
  55. fRepair       = ZpOpt.fRepair;
  56. #ifdef WIN32
  57. fPrivilege    = ZpOpt.fPrivilege;
  58. #endif
  59. fExtra        = ZpOpt.fExtra;
  60. fVerbose      = ZpOpt.fVerbose;
  61. fForce        = ZpOpt.fForce;
  62. fSystem       = ZpOpt.fSystem;
  63. fVolume       = ZpOpt.fVolume;
  64. fNoDirEntries = ZpOpt.fNoDirEntries;
  65. fJunkDir      = ZpOpt.fJunkDir;
  66. fCRLF_LF      = ZpOpt.fCRLF_LF;
  67. fLF_CRLF      = ZpOpt.fLF_CRLF;
  68. fEncrypt      = ZpOpt.fEncrypt;
  69. fRecurse      = ZpOpt.fRecurse;
  70. fMove         = ZpOpt.fMove;
  71. fLatestTime   = ZpOpt.fLatestTime;
  72. fUpdate       = ZpOpt.fUpdate;
  73. fFreshen      = ZpOpt.fFreshen;
  74. fQuiet        = ZpOpt.fQuiet;
  75. fComment      = ZpOpt.fComment;
  76. fLevel        = ZpOpt.fLevel;
  77. fmakesfx      = fMakeSFX;
  78. fOffsets      = ZpOpt.fOffsets;
  79. #ifdef WIN32
  80. fdossfx       = fMakeDosSFX;
  81. #endif
  82. #ifndef WIN32
  83. _fmemset(&lpumb->ofn, '', sizeof(OPENFILENAME)); /* initialize struct */
  84. #else
  85. memset(&lpumb->ofn, '', sizeof(OPENFILENAME)); /* initialize struct */
  86. #endif
  87. WinAssert(hWnd);
  88. lpumb->szUnzipToDirNameTmp[0] = '';
  89. lpumb->ofn.lStructSize = sizeof(OPENFILENAME);
  90. lpumb->ofn.hwndOwner = hWnd;
  91. lpumb->ofn.hInstance = hInst;
  92. lpumb->ofn.lpstrFilter = "Zip Files (*.zip)*.zipSelf-extracting Files (*.exe)*.exeAll Files (*.*)*.*";
  93. lpumb->ofn.nFilterIndex = 1;
  94. lpumb->ofn.lpstrFile = lpumb->szUnzipToDirNameTmp; /* result goes here! */
  95. lpumb->ofn.nMaxFile = PATH_MAX;
  96. lpumb->ofn.lpstrFileTitle = NULL; /* NULL causes nMaxFileTitle to be ignored */
  97. lpumb->ofn.nMaxFileTitle = PATH_MAX; /* ignored ! */
  98. lpumb->ofn.lpstrTitle = (LPSTR)"Archive Name";
  99. lpumb->ofn.lpstrInitialDir =
  100.    (LPSTR)(!szTargetZipDir[0] ? NULL : szTargetZipDir);
  101. lpumb->ofn.Flags = OFN_SHOWHELP | OFN_HIDEREADONLY;
  102. uf.fTrailingSlash = FALSE; /* set trailing slash to FALSE */
  103. lpumb->szZipFileName[0] = '';
  104. dwCommDlgHelpId = HELPID_ZIP_GET_ARCHIVE_NAME;
  105. if (GetOpenFileName(&lpumb->ofn)) /* successfully got archive name ? */
  106.    {
  107.    if (lstrcmpi(lpumb->szUnzipToDirNameTmp, lpumb->szZipFileName)!=0)
  108.       {
  109.       lstrcpy(tempPath, lpumb->szUnzipToDirNameTmp);
  110.       if (!uf.fTrailingSlash) /* Do we have a trailing slash? */
  111.          { /* No - strip file name off and save it */
  112.          StripDirectory(tempPath);
  113.          lstrcpy(tempFileName, tempPath);
  114.          /* Strip file name off, we've just saved it */
  115.          GetDirectory(lpumb->szUnzipToDirNameTmp);
  116.          }
  117.       uf.fTrailingSlash = FALSE;
  118.       /* Okay, make the directory, if necessary */
  119.       lstrcpy(szTargetZipDir, lpumb->szUnzipToDirNameTmp);
  120.       if (MakeDirectory(lpumb->szUnzipToDirNameTmp, FALSE))
  121.          {
  122.          if (lpumb->szUnzipToDirNameTmp[0] != '')
  123.             lstrcat(lpumb->szUnzipToDirNameTmp, "\");
  124.          lstrcat(lpumb->szUnzipToDirNameTmp, tempFileName);
  125.          /* lpumb->szUnzipToDirNameTmp now contains the fully qualified
  126.             zip file name.
  127.          */
  128.          if (strrchr(lpumb->szUnzipToDirNameTmp, '.') == NULL)
  129.             {
  130.             if (!fMakeSFX)
  131.                lstrcat(lpumb->szUnzipToDirNameTmp, ".zip");
  132.             else
  133.                lstrcat(lpumb->szUnzipToDirNameTmp, ".exe");
  134.             }
  135.          lstrcpy(szTargetFileName, lpumb->szUnzipToDirNameTmp);
  136.          lstrcpy(lpumb->szZipFileName, lpumb->szUnzipToDirNameTmp);
  137.          ZpZCL.lpszZipFN = szTargetFileName;
  138.          }
  139.       if (fSaveZipToDir)
  140.          {
  141.          getcwd(szTargetZipDir, PATH_MAX);
  142.          WriteZipOptionsProfile();
  143.          }
  144.    /* NOTE: Here is where we must actually call to get the files
  145.       to go into the archive. All we've done so far is get the
  146.       archive name.
  147.    */
  148.       {
  149.       dwCommDlgHelpId = HELPID_ZIP_SELECT_FILES;
  150. #ifndef WIN32
  151.       _fmemset(&lpumb->ofn, '', sizeof(OPENFILENAME)); /* initialize struct */
  152. #else
  153.       memset(&lpumb->ofn, '', sizeof(OPENFILENAME)); /* initialize struct */
  154. #endif
  155.       WinAssert(hWnd);
  156.       szTargetZipFile[0] = '';
  157.       lpumb->ofn.lStructSize = sizeof(OPENFILENAME);
  158.       lpumb->ofn.hwndOwner = hWnd;
  159.       lpumb->ofn.hInstance = hInst;
  160.       lpumb->ofn.lpstrFilter = "All Files (*.*)*.*";
  161.       lpumb->ofn.nFilterIndex = 1;
  162.       lpumb->ofn.lpstrFile = szTargetZipFile;
  163.       lpumb->ofn.nMaxFile = PATH_MAX;
  164.       lpumb->ofn.lpstrFileTitle = NULL;
  165.       lpumb->ofn.nMaxFileTitle = PATH_MAX; /* ignored ! */
  166.       wsprintf(lpumb->szBuffer, "Archive %s", lpumb->szZipFileName);
  167.       lpumb->ofn.lpstrTitle = (LPSTR) lpumb->szBuffer;
  168.       lpumb->ofn.lpstrInitialDir =
  169.          (LPSTR)(!szTargetZipDir[0] ? NULL : szTargetZipDir);
  170.       lpumb->ofn.Flags = OFN_SHOWHELP | OFN_ENABLEHOOK | OFN_CREATEPROMPT |
  171.          OFN_HIDEREADONLY|OFN_ENABLETEMPLATE;
  172. #ifndef WIN32
  173.       lpfnGetFilesProc = MakeProcInstance((FARPROC)GetFilesProc, hInst);
  174. #   ifndef MSC
  175.       (UINT CALLBACK *)lpumb->ofn.lpfnHook = (UINT CALLBACK *)lpfnGetFilesProc;
  176. #   else
  177.       lpumb->ofn.lpfnHook = lpfnGetFilesProc;
  178. #   endif
  179. #else
  180.       lpumb->ofn.lpfnHook = (LPOFNHOOKPROC)GetFilesProc;
  181. #endif
  182.       lpumb->ofn.lpTemplateName = "GETFILES";   /* see getfiles.dlg   */
  183.       if (GetOpenFileName(&lpumb->ofn) && (hFileList &&
  184.              (ZpZCL.lpszZipFN[0] != '')) ||
  185.              (ZpOpt.fRepair && (ZpZCL.lpszZipFN[0] != '')))
  186.          {
  187.          char *ptr;
  188.          UpdateWindow(hWndMain);
  189.          if (fMakeSFX)
  190.             {
  191.             ptr = strrchr(lpumb->szZipFileName, '.') + 1;
  192.             *ptr = '';
  193.             lstrcat(lpumb->szZipFileName, "exe");
  194.             lstrcpy(ZpZCL.lpszZipFN, lpumb->szZipFileName);
  195.             }
  196.          ZpZCL.FNV = (char **)szFileList;
  197.          if (!ZpOpt.fRepair)
  198.             BufferOut( "Creating/Updating Archive: %sn",
  199.                lpumb->szZipFileName);
  200.          else
  201.             if (ZpZCL.argc != 0)
  202.                BufferOut( "Repairing/Updating Archive: %sn",
  203.                   lpumb->szZipFileName);
  204.             else
  205.                BufferOut( "Repairing Archive: %sn",
  206.                   lpumb->szZipFileName);
  207.          hSaveCursor = SetCursor(hHourGlass);
  208.          ShowCursor(TRUE);
  209.          if (fMakeSFX)
  210.             {
  211.             OFSTRUCT ofStrSrc;
  212.             OFSTRUCT ofStrDest;
  213.             HFILE hfSrcFile, hfDstFile;
  214. #ifndef WIN32
  215.             struct find_t ffblk;
  216. #else
  217.             WIN32_FIND_DATA ffblk;
  218.             HANDLE hfile;
  219. #endif
  220.             ZpOpt.fOffsets = TRUE; /* Force adjusting of offsets */
  221.             /* Get the path we are executing from */
  222.             GetModuleFileName(hInst, szTargetName,
  223.                   sizeof(szTargetName));
  224.             ptr = strrchr(szTargetName, '\') + 1;
  225.             *ptr = ''; /* We've now got the path we are executing from */
  226. #ifdef WIN32
  227.             if (fMakeDosSFX)
  228.                lstrcat(szTargetName, "sfx16.dat");
  229.             else
  230.                lstrcat(szTargetName, "sfx32.dat");
  231. #else
  232.             lstrcat(szTargetName, "sfx16.dat");
  233. #endif
  234. #ifndef WIN32
  235.             if (_dos_findfirst(ZpZCL.lpszZipFN,
  236.                 _A_NORMAL|_A_RDONLY|_A_ARCH,&ffblk) != 0)
  237. #else
  238.             if ((hfile = FindFirstFile(ZpZCL.lpszZipFN, &ffblk)) == INVALID_HANDLE_VALUE)
  239. #endif
  240.                {
  241.                hfSrcFile = LZOpenFile(szTargetName,
  242.                   &ofStrSrc, OF_READ);
  243.                if (hfSrcFile < 0)
  244.                   {
  245. #ifdef WIN32
  246.                   if (fMakeDosSFX)
  247.                      MessageBox (hWnd, "Can't find SFX16.DAT, continuing without making SFX exe.",
  248.                         "Can't find SFX16.DAT", MB_ICONINFORMATION | MB_OK);
  249.                   else
  250.                      MessageBox (hWnd, "Can't find SFX32.DAT, continuing without making SFX exe.",
  251.                         "Can't find SFX32.DAT", MB_ICONINFORMATION | MB_OK);
  252. #else
  253.                   MessageBox (hWnd, "Can't find SFX16.D1, continuing without making SFX exe.",
  254.                      "Can't find SFX16.DAT", MB_ICONINFORMATION | MB_OK);
  255. #endif
  256.                   }
  257.                else
  258.                   {
  259.                   hfDstFile = LZOpenFile(ZpZCL.lpszZipFN,
  260.                      &ofStrDest, OF_CREATE);
  261.                   LZCopy(hfSrcFile, hfDstFile);
  262.                   LZClose(hfSrcFile);
  263.                   LZClose(hfDstFile);
  264.                   }
  265.                }
  266.             else
  267.                {
  268.                int in, out;
  269. #ifdef WIN32
  270.                FindClose(hfile);
  271. #endif
  272.                /* Copy the prefix file over to the temp file */
  273.                hfSrcFile = LZOpenFile(szTargetName,
  274.                   &ofStrSrc, OF_READ);
  275.                if (hfSrcFile < 0)
  276.                   {
  277. #ifdef WIN32
  278.                   if (fMakeDosSFX)
  279.                      MessageBox (hWnd, "Can't find SFX16.DAT, continuing without making SFX exe.",
  280.                         "Can't find SFX16.DAT", MB_ICONINFORMATION | MB_OK);
  281.                   else
  282.                      MessageBox (hWnd, "Can't find SFX32.DAT, continuing without making SFX exe.",
  283.                         "Can't find SFX32.DAT", MB_ICONINFORMATION | MB_OK);
  284. #else
  285.                   MessageBox (hWnd, "Can't find SFX16.DAT, continuing without making SFX exe.",
  286.                      "Can't find SFX16.DAT", MB_ICONINFORMATION | MB_OK);
  287. #endif
  288.                   }
  289.                else
  290.                   {
  291.                   char buf[READ_WRITE_BUF];
  292.                   /* Get a temp file name and directory (Goes in directory
  293.                    * designated by tmp, temp or the current directory)
  294.                    */
  295. #ifdef WIN32
  296.                   GetTempPath(sizeof(szTargetName), szTargetName);
  297.                   GetTempFileName(szTargetName, "WIZ", 0, szTempFileName);
  298. #else
  299.                   GetTempFileName(0, "WIZ", 0, szTempFileName);
  300. #endif
  301.                   hfDstFile = LZOpenFile(szTempFileName,
  302.                      &ofStrDest, OF_CREATE);
  303.                   LZCopy(hfSrcFile, hfDstFile);
  304.                   LZClose(hfSrcFile);
  305.                   LZClose(hfDstFile);
  306.                   /* We've got the prefix moved over, now append the
  307.                    * archive file itself.
  308.                    */
  309.                   out = open(szTempFileName, O_RDWR | O_APPEND | O_BINARY );
  310.                   in = open(ZpZCL.lpszZipFN, O_RDONLY | O_BINARY);
  311.                   lseek(out, SEEK_CUR, SEEK_END);
  312.                   while (read(in, buf, READ_WRITE_BUF) > 0)
  313.                      {
  314.                      write(out, buf, READ_WRITE_BUF);
  315.                      }
  316.                   close(in);
  317.                   close(out);
  318.                   /* Copy the temp file back over the original file */
  319.                   hfSrcFile = LZOpenFile(szTempFileName,
  320.                      &ofStrSrc, OF_READ);
  321.                   if (hfSrcFile < 0)
  322.                      {
  323.                      MessageBox (hWnd, "Can't find temp file, continuing without making SFX exe.",
  324.                         "Can't find temp file", MB_ICONINFORMATION | MB_OK);
  325.                      }
  326.                   else
  327.                      {
  328.                      hfDstFile = LZOpenFile(ZpZCL.lpszZipFN,
  329.                         &ofStrDest, OF_CREATE);
  330.                      LZCopy(hfSrcFile, hfDstFile);
  331.                      LZClose(hfSrcFile);
  332.                      LZClose(hfDstFile);
  333.                      remove(szTempFileName);
  334.                      lstrcpy(szTempFileName, ZpZCL.lpszZipFN);
  335.                      if (lstrcmpi(&szTempFileName[lstrlen(ZpZCL.lpszZipFN) - 4],
  336.                         ".exe") != 0)
  337.                         {
  338.                         lstrcpy(&ZpZCL.lpszZipFN[lstrlen(ZpZCL.lpszZipFN) - 4],
  339.                            ".exe");
  340.                         rename(szTempFileName, ZpZCL.lpszZipFN);
  341.                         }
  342.                      }
  343.                   }
  344.                }
  345.             }
  346.          ZipSetOptions(ZpOpt);
  347.          ZipRetCode = ZipArchive(ZpZCL);
  348.          ShowCursor(FALSE);
  349.          SetCursor(hSaveCursor);
  350.          }
  351.       }
  352.       if ((toupper(lpumb->ofn.lpstrFile[0]) != 'A') &&
  353.           (toupper(lpumb->ofn.lpstrFile[0]) != 'B'))
  354.           {
  355.           lstrcpy(szTargetZipFile, lpumb->ofn.lpstrFile);
  356.           if ((lpchLast = lstrrchr(szTargetZipFile, '\'))!=0)
  357.              {
  358.              *lpchLast = '';
  359.              }
  360.            else if ((lpchLast = lstrrchr(szTargetZipFile, ':'))!=0)
  361.              {
  362.              *(lpchLast+1) = '';
  363.              lstrcat(szTargetZipFile, "\");
  364.              }
  365.            }
  366.         }
  367.       }
  368. else /* either real error or canceled */
  369.    {
  370.    DWORD dwExtdError = CommDlgExtendedError(); /* debugging */
  371.    if (dwExtdError != 0L) /* if not canceled then real error */
  372.       {
  373.       wsprintf (lpumb->szBuffer, szCantMakeZip, dwExtdError);
  374.       MessageBox (hWnd, lpumb->szBuffer, szAppName, MB_ICONINFORMATION | MB_OK);
  375.       }
  376.    else
  377.       {
  378.       RECT mRect;
  379.       WinAssert(hWndMain);
  380.       GetWindowRect(hWndMain, &mRect);
  381.       InvalidateRect(hWndMain, &mRect, TRUE);
  382.       SendMessage(hWndMain, WM_SIZE, SIZE_RESTORED,
  383.          MAKELONG(mRect.right-mRect.left, mRect.top-mRect.bottom));
  384.       UpdateWindow(hWndMain);
  385.       }
  386.    }
  387. /* Restore zip options flags */
  388. #ifdef WIN32
  389. ZpOpt.fPrivilege    = fPrivilege;
  390. #endif
  391. ZpOpt.fExtra        = fExtra;
  392. ZpOpt.fRepair       = fRepair;
  393. ZpOpt.fVerbose      = fVerbose;
  394. ZpOpt.fForce        = fForce;
  395. ZpOpt.fSystem       = fSystem;
  396. ZpOpt.fVolume       = fVolume;
  397. ZpOpt.fNoDirEntries = fNoDirEntries;
  398. ZpOpt.fJunkDir      = fJunkDir;
  399. ZpOpt.fCRLF_LF      = fCRLF_LF;
  400. ZpOpt.fLF_CRLF      = fLF_CRLF;
  401. ZpOpt.fEncrypt      = fEncrypt;
  402. ZpOpt.fRecurse      = fRecurse;
  403. ZpOpt.fMove         = fMove;
  404. ZpOpt.fLatestTime   = fLatestTime;
  405. ZpOpt.fUpdate       = fUpdate;
  406. ZpOpt.fFreshen      = fFreshen;
  407. ZpOpt.fComment      = fComment;
  408. ZpOpt.fQuiet        = fQuiet;
  409. ZpOpt.fLevel        = fLevel;
  410. fMakeSFX              = fmakesfx;
  411. ZpOpt.fOffsets      = fOffsets;
  412. #ifdef WIN32
  413. fMakeDosSFX           = fdossfx;
  414. #endif
  415. if (hFileList)
  416.    {
  417.    GlobalUnlock(hFileList);
  418.    GlobalFree(hFileList);
  419.    }
  420. }