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

压缩解压

开发平台:

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. #include <string.h>
  8. #include <io.h>
  9. #include <stdio.h>
  10. #include <ctype.h>
  11. #include "wiz.h"
  12. #include "helpids.h"
  13. #ifndef WIN32
  14. #include <lzexpand.h>
  15. #endif                           
  16. void StripDirectory(LPSTR lpDir);
  17. static char szTargetDirName[128] = "";
  18. static char __based(__segname("STRINGS_TEXT")) szCantCopyFile[] =
  19.    "Internal error: Cannot copy file. Common dialog error code is 0x%lX.";
  20. #ifdef __BORLANDC__
  21. #pragma warn -par
  22. #endif
  23. BOOL WINAPI CopyFileProc(HWND hDlg, WORD wMessage, WPARAM wParam, LPARAM lParam)
  24. {
  25.     static OPENFILENAME __far *lpofn = 0;
  26.     static WORD wClose;
  27.     switch (wMessage)
  28.     {
  29.     case WM_DESTROY:
  30.         if (lpofn && lpofn->lpstrFile && (wClose == IDOK))
  31.         {
  32.          LPSTR lpszSeparator;
  33.         /* If we have a trailing '\' we need to get it */
  34.         GetDlgItemText(hDlg, edt1, lpofn->lpstrFile, PATH_MAX);
  35.         /* Flag whether there is a trailing backslash */
  36.         lpszSeparator = lpofn->lpstrFile+lstrlen(lpofn->lpstrFile)-1;
  37.         if (*lpszSeparator == '\')
  38.             uf.fTrailingSlash = TRUE;
  39.         }
  40.         break;
  41.     case WM_INITDIALOG:
  42.         {
  43.             RECT    rT1, rT2;
  44.             short   nWidth, nHeight;
  45.             HWND hTemp;
  46.             lpofn = (OPENFILENAME __far *)lParam;
  47.             CenterDialog(GetParent(hDlg), hDlg); /* center on parent */
  48.             /* Disable the file type label
  49.                and the file type combo box
  50.                Note: stc2, cmb1 etc are defined in DLGS.H in the standard
  51.                windows include files.
  52.             */
  53.             hTemp = GetDlgItem(hDlg, stc2);
  54.             WinAssert(hTemp);
  55.             EnableWindow(hTemp, FALSE);
  56.             ShowWindow(hTemp, SW_HIDE);
  57.             hTemp = GetDlgItem(hDlg, cmb1);
  58.             WinAssert(hTemp);
  59.             EnableWindow(hTemp, FALSE);
  60.             ShowWindow(hTemp, SW_HIDE);
  61.             hTemp = GetDlgItem(hDlg, cmb2);
  62.             WinAssert(hTemp);
  63.             GetWindowRect(hTemp, &rT1);
  64.             /* Extend the rectangle of the list of files
  65.                in the current directory so that it's flush
  66.                with the bottom of the Drives combo box
  67.             */
  68.             hTemp = GetDlgItem(hDlg, lst1);
  69.             WinAssert(hTemp);
  70.             GetWindowRect(hTemp, &rT2);
  71.             nWidth = (short)(rT2.right - rT2.left);
  72.             nHeight = (short)(rT1.bottom - rT2.top);
  73.             ScreenToClient(hDlg, (LPPOINT)&rT2);
  74.             MoveWindow(hTemp,
  75.                         rT2.left, rT2.top,
  76.                         nWidth,
  77.                         nHeight,
  78.                         TRUE);
  79.         }
  80.     default:
  81.         break;
  82.     }
  83.     /* message not handled */
  84.     return 0;
  85. }
  86. #ifdef __BORLANDC__
  87. #pragma warn .par
  88. #endif
  89. /* Strip off the directory leaving only the file name */
  90. void StripDirectory(LPSTR lpDir)
  91. {
  92. LPSTR lpchLast, i, j;
  93. /* If no '\' then simply return */
  94. if ((lpchLast = lstrrchr(lpDir, '\')) == 0)
  95.    {
  96.    return;
  97.    }
  98. if ((lpchLast = lstrrchr(lpDir, '\'))!=0)
  99.    {
  100.    for (i = lpchLast+1, j = lpDir; *i; i++, j++)
  101.       {
  102.       *j = *i;
  103.       }
  104.    *j = '';
  105.    }
  106. else if ((lpchLast = lstrrchr(lpDir, ':'))!=0)
  107.    {
  108.    for (i = lpchLast+1, j = lpDir; *i; i++, j++)
  109.       {
  110.       *j = *i;
  111.       }
  112.    *j = '';
  113.    }
  114. }
  115. void CopyArchive(HWND hWnd, BOOL move_flag, BOOL rename_flag)
  116. {
  117. char tempFileName[PATH_MAX], tempPath[PATH_MAX];
  118. #ifndef WIN32
  119.    FARPROC lpfnSelectDir;
  120. #endif
  121. #ifndef WIN32
  122. _fmemset(&lpumb->ofn, '', sizeof(OPENFILENAME)); /* initialize struct */
  123. #else
  124. memset(&lpumb->ofn, '', sizeof(OPENFILENAME)); /* initialize struct */
  125. #endif
  126. WinAssert(hWnd);
  127. lpumb->ofn.lStructSize = sizeof(OPENFILENAME);
  128. lpumb->ofn.hwndOwner = hWnd;
  129. lpumb->ofn.hInstance = hInst;
  130. lpumb->ofn.lpstrFilter = "All Files (*.*)*.*";
  131. lpumb->ofn.nFilterIndex = 1;
  132. /* strip off filename */
  133. lstrcpy(lpumb->szUnzipToDirNameTmp, lpumb->szFileName);
  134. /* Strip off path */
  135. StripDirectory(lpumb->szUnzipToDirNameTmp);
  136. /* Now we've got just the file name */
  137. lpumb->ofn.lpstrFile = lpumb->szUnzipToDirNameTmp; /* result goes here! */
  138. /* Save file name only */
  139. lstrcpy(tempFileName, lpumb->szUnzipToDirNameTmp);
  140. lpumb->ofn.nMaxFile = PATH_MAX;
  141. lpumb->ofn.lpstrFileTitle = NULL;
  142. lpumb->ofn.nMaxFileTitle = PATH_MAX; /* ignored ! */
  143. if (move_flag)
  144.    {
  145.    lpumb->ofn.lpstrTitle = (LPSTR)"Move Archive To";
  146.    lpumb->ofn.lpstrInitialDir =
  147.    (LPSTR)(!szTargetDirName[0] ? NULL : szTargetDirName);
  148.    }
  149. else
  150.    if (rename_flag)
  151.       {
  152.       lpumb->ofn.lpstrTitle = (LPSTR)"Rename Archive To";
  153.       lpumb->ofn.lpstrInitialDir = (LPSTR)((uf.fUnzipToZipDir ||
  154.          !lpumb->szDirName[0]) ? NULL : lpumb->szDirName);
  155.       }
  156.    else
  157.       {
  158.       lpumb->ofn.lpstrTitle = (LPSTR)"Copy Archive To";
  159.       lpumb->ofn.lpstrInitialDir =
  160.          (LPSTR)(!szTargetDirName[0] ? NULL : szTargetDirName);
  161.       }
  162. lpumb->ofn.Flags = OFN_SHOWHELP | OFN_ENABLEHOOK | OFN_CREATEPROMPT |
  163.    OFN_HIDEREADONLY|OFN_ENABLETEMPLATE|OFN_NOCHANGEDIR;
  164. #ifndef WIN32
  165.                 /* Just using an available pointer */
  166. lpfnSelectDir = MakeProcInstance((FARPROC)CopyFileProc, hInst);
  167. #   ifndef MSC
  168. (UINT CALLBACK *)lpumb->ofn.lpfnHook = (UINT CALLBACK *)lpfnSelectDir;
  169. #   else
  170. lpumb->ofn.lpfnHook = lpfnSelectDir;
  171. #   endif
  172. #else
  173. lpumb->ofn.lpfnHook = (LPOFNHOOKPROC)CopyFileProc;
  174. #endif
  175. lpumb->ofn.lpTemplateName = "COPYFILE";   /* see copyfile.dlg   */
  176. uf.fTrailingSlash = FALSE; /* set trailing slash to FALSE */
  177. if (GetSaveFileName(&lpumb->ofn)) /* successfully got dir name ? */
  178.    {
  179.    if (lstrcmpi(lpumb->szUnzipToDirNameTmp, lpumb->szFileName)!=0)
  180.       {
  181.       lstrcpy(tempPath, lpumb->szUnzipToDirNameTmp);
  182.       if (!uf.fTrailingSlash) /* Do we have a trailing slash? */
  183.          { /* No - strip file name off and save it */
  184.          StripDirectory(tempPath);
  185.          lstrcpy(tempFileName, tempPath);
  186.          /* Strip file name off, we've just saved it */
  187.          GetDirectory(lpumb->szUnzipToDirNameTmp);
  188.          }
  189.       uf.fTrailingSlash = FALSE;
  190.       /* Okay, make the directory, if necessary */
  191.       if (MakeDirectory(lpumb->szUnzipToDirNameTmp, FALSE))
  192.          {
  193. #ifndef WIN32
  194.          OFSTRUCT ofStrSrc;
  195.          OFSTRUCT ofStrDest;
  196.          HFILE hfSrcFile, hfDstFile;
  197. #endif
  198.          if (lpumb->szUnzipToDirNameTmp[0] != '')
  199.             lstrcat(lpumb->szUnzipToDirNameTmp, "\");
  200.          lstrcat(lpumb->szUnzipToDirNameTmp, tempFileName);
  201.          if (move_flag == TRUE)
  202.             BufferOut( "Moving: n%snton%s",
  203.                lpumb->szFileName, lpumb->ofn.lpstrFile);
  204.          else
  205.             if (rename_flag == FALSE)
  206.                BufferOut( "Copying: n%snton%s",
  207.                lpumb->szFileName, lpumb->ofn.lpstrFile);
  208.          if ((rename_flag == TRUE) &&
  209.             ((lpumb->szFileName[0] == lpumb->ofn.lpstrFile[0]) ||
  210.             (lpumb->ofn.lpstrFile[1] != ':')))
  211.             {
  212.             BufferOut( "Renaming: n%snton%sn",
  213.                lpumb->szFileName, lpumb->ofn.lpstrFile);
  214.             rename(lpumb->szFileName, lpumb->ofn.lpstrFile);
  215.             lstrcpy(lpumb->szFileName, lpumb->ofn.lpstrFile);
  216.             UpdateButtons(); /* update state of buttons */
  217.             SetCaption(hWnd);
  218.             }
  219.          else if (rename_flag == FALSE)
  220.             {
  221. #ifndef WIN32
  222.             hfSrcFile = LZOpenFile(lpumb->szFileName,
  223.                &ofStrSrc, OF_READ);
  224.             hfDstFile = LZOpenFile(lpumb->ofn.lpstrFile,
  225.                &ofStrDest, OF_CREATE);
  226.             LZCopy(hfSrcFile, hfDstFile);
  227.             LZClose(hfSrcFile);
  228.             LZClose(hfDstFile);
  229. #else
  230.             CopyFile(lpumb->szFileName, lpumb->ofn.lpstrFile, FALSE);
  231. #endif
  232.             BufferOut( " ...%sn", "Done");
  233.             if ((toupper(lpumb->ofn.lpstrFile[0]) != 'A') &&
  234.                (toupper(lpumb->ofn.lpstrFile[0]) != 'B'))
  235.                {
  236.                lstrcpy(szTargetDirName, lpumb->ofn.lpstrFile);
  237.                if ((lpchLast = lstrrchr(szTargetDirName, '\'))!=0)
  238.                   {
  239.                   *lpchLast = '';
  240.                   }
  241.                else if ((lpchLast = lstrrchr(szTargetDirName, ':'))!=0)
  242.                   {
  243.                   *(lpchLast+1) = '';
  244.                   lstrcat(szTargetDirName, "\");
  245.                   }
  246.                }
  247.             }
  248.          if (move_flag)
  249.             {
  250.             /*
  251.             * It's not clear what should be done here, just
  252.             * clear the list box and be done with it, or
  253.             * actually go to the new location of the zipfile.
  254.             * The election at this point is to just be done
  255.             * with it.
  256.             */
  257. #ifndef WIN32
  258.             SendMessage(hWndList, LB_RESETCONTENT, 0, 0);
  259. #else
  260.             ListView_DeleteAllItems(hWndList);
  261. #endif
  262.             remove(lpumb->szFileName);
  263.             lpumb->szFileName[0] = '';
  264.             UpdateButtons(); /* update state of buttons */
  265.             }
  266.          }
  267.       }
  268.    }
  269. else /* either real error or canceled */
  270.    {
  271.    DWORD dwExtdError = CommDlgExtendedError(); /* debugging */
  272.    if (dwExtdError != 0L) /* if not canceled then real error */
  273.       {
  274.       wsprintf (lpumb->szBuffer, szCantCopyFile, dwExtdError);
  275.       MessageBox (hWnd, lpumb->szBuffer, szAppName, MB_ICONINFORMATION | MB_OK);
  276.       }
  277.    else
  278.       {
  279.       RECT mRect;
  280.       WinAssert(hWndMain);
  281.       GetWindowRect(hWndMain, &mRect);
  282.       InvalidateRect(hWndMain, &mRect, TRUE);
  283.       SendMessage(hWndMain, WM_SIZE, SIZE_RESTORED,
  284.          MAKELONG(mRect.right-mRect.left, mRect.top-mRect.bottom));
  285.       UpdateWindow(hWndMain);
  286.       }
  287.    }
  288. #ifndef WIN32
  289.                 /* Just using an available pointer */
  290.    FreeProcInstance(lpfnSelectDir);
  291. #endif
  292. }