<form id="hz9zz"></form>
  • <form id="hz9zz"></form>

      <nobr id="hz9zz"></nobr>

      <form id="hz9zz"></form>

    1. 明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

      為Visual FoxPro應用程序增加文件壓縮技巧

      [摘要]壓縮文件可以認為是一個包裝文件的容器。通過文件壓縮,大量文件可以被打包起來并當作一個文件來看待。此外,壓縮文件在尺寸上普遍比原文件小,如文本文件在壓縮以后的平均大小是原來的40%。因此,文件壓縮能夠...
      壓縮文件可以認為是一個包裝文件的容器。通過文件壓縮,大量文件可以被打包起來并當作一個文件來看待。此外,壓縮文件在尺寸上普遍比原文件小,如文本文件在壓縮以后的平均大小是原來的40%。因此,文件壓縮能夠大幅度的節省存儲空間和網絡傳輸時間,從而使得文件的攜帶和傳輸更加方便快捷。
      在DOS環境下,經常使用到的壓縮程序是ARJ、RAR和PKZIP/PKUNZIP。在Windows環境下,經常使用到的壓縮軟件是WinZip和CleverZip。這些軟件基本上都是共享軟件,都可以從網絡上免費獲取。
      在數據庫應用程序中,經常需要對數據文件進行壓縮備份或者從壓縮文件中恢復。以Visual FoxPro為例,通常的做法是通過FoxPro語句調用壓縮軟件,然后在該壓縮軟件的操作界面上進行文件壓縮或者文件恢復。這種做法不僅在操作界面上非常不友好,而且大大地削弱了應用程序的整體性。以下介紹的FoxPro程序利用了兩個共享的動態鏈接庫AZIP.DLL和AUNZIP.DLL在Visual FoxPro內部實現了文件壓縮與解壓縮功能,從而較好地解決了這個問題。

      文件壓縮程序
      * 程序名稱:AZIP.PRG
      * 程序說明:在Visual FoxPro中實現文件壓縮
      * 程序要求:AZIP32.DLL放置在Windows的System目錄或當前目錄下
      * 使用方法:USAGE: AZIP(lInitialize, sArchive, sInclFiles[, ZipParams])
      * 參數說明:
      --lInitialize:.T. – 第一次使用本程序,.F. – 非第一次使用本程序
      --sArchive: 帶有擴展名的壓縮文件名,如"C:\THISFILE.ZIP"
      --sInclFiles:需要壓縮的文件名稱,不同文件名之間有一個空格
      例1: "D:\CUSTDATA.DBF"
      例2: "C:\CUSTOMER.DBF D:\*.TXT D:\DATABASES\*.*"
      --ZIPparams:文件壓縮參數[可選]
      e(x) x = 'X' 最大程度壓縮
      x = '0' 無壓縮
      x = 'S' 最小程度壓縮
      x = 'N' 普通壓縮(缺。
      P 包括目錄信息
      S 使用密碼(必須是最后一部分)
      * 示范語句:AZIP(.T., "ZIPFILE", "*.DBF *.TXT Customer.doc")
      * 返回參數:被壓縮的文件數目,如果沒有指定文件名則返回-1
      * 接受參數
      PARAMETERS lInitialize, sArchive, sInclFiles, ZIPparams
      PRIVATE Params, sTemp
      Params = PARAMETERS()
      * 聲明需要調用的DLL函數并使當前窗口獲得焦點
      IF Params = 0 OR lInitialize
      PRIVATE HWND
      DECLARE INTEGER GetActiveWindow IN win32api
      HWND = GetActiveWindow()
      DECLARE addZIP_Initialise IN AZIP32
      DECLARE SHORT addZIP_SetParentWindowHandle IN AZIP32 SHORT @ HWindow
      DECLARE SHORT addZIP_ArchiveName IN AZIP32 STRING @ sArchName
      DECLARE SHORT addZIP_Include IN AZIP32 STRING @ sFileName
      DECLARE SHORT addZIP_Recurse IN AZIP32 SHORT @ nRecurse
      DECLARE SHORT addZIP_SetCompressionLevel IN AZIP32 SHORT @ nComprLvl
      DECLARE SHORT addZIP_IncludeDirectoryEntries IN AZIP32 SHORT @ nInclDir
      DECLARE SHORT addZIP_IncludeEmptyDirectoryEntries IN AZIP32 SHORT @ nInclEDir
      DECLARE SHORT addZIP_Update IN AZIP32 SHORT @ nUpdate
      DECLARE SHORT addZIP_Update IN AZIP32 SHORT @ nUpdate
      DECLARE SHORT addZIP IN AZIP32
      DECLARE SHORT addZIP_Register IN AZIP32 String @ RegName, Integer @ RegNum
      DECLARE SHORT addZIP_Encrypt IN AZIP32 STRING @ sPassw
      addZIP_Initialise()
      addZIP_SetParentWindowHandle(HWND)
      * 如果使用的是本動態鏈接庫的注冊版本,則可以添加下面一行
      addZIP_Register("RegistrationName", RegistrationNumber)
      * 其作用是在壓縮文件中使用密碼保護
      * 如果沒有指定壓縮文件名,則返回0(沒有文件被壓縮)
      IF Params < 2
      RETURN 0
      ENDIF
      ENDIF
      * 如果沒有指定被壓縮文件名,則響鈴并返回0(沒有文件被壓縮)
      IF Params < 3
      ?? CHR(7)
      MESSAGEBOX('缺少操作參數!',0, 'AZip 警告!')
      RETURN 0
      ENDIF
      * 如果指定了文件壓縮參數,按照參數進行壓縮選擇
      IF Params > 3
      ZIPparams = ALLT(ZIPparams)
      PRIVATE LastPos, PASSWORD, nCurPos
      LastPos = LEN(ZIPparams) + 1
      * 檢查是否存在壓縮密碼
      nCurPos = ATC('S', ZIPparams)
      IF nCurPos > 0
      cPassWord = SUBSTR(ZIPparams, nCurPos+1)
      addZIP_Encrypt(cPassWord)
      ZIPparams = LEFT(ZIPparams, nCurPos -1)
      ENDIF
      * 檢查是否保存目錄信息
      nCurPos = ATC('P', ZIPparams)
      IF nCurPos > 0
      addZIP_Recurse(1)
      addZIP_IncludeDirectoryEntries(1)
      ENDIF
      * 檢查文件壓縮的程度
      nCurPos = ATC('E', ZIPparams)
      IF nCurPos > 0
      PRIVATE cCompLevel, nCompLevel
      cCompLevel = SUBSTR(ZIPparams, nCurPos + 1, 1)
      DO CASE
      * 最大程度壓縮
      CASE cCompLevel = 'X'
      nCompLevel = 3
      * 最小程度壓縮
      CASE cCompLevel = 'S' && min compression
      nCompLevel = 1
      * 沒有壓縮
      CASE cCompLevel = '0' && no compression
      nCompLevel = 0
      * 正常壓縮
      OTHERWISE && normal/default compression
      nCompLevel = 2
      ENDCASE
      addZIP_SetCompressionLevel(nCompLevel)
      ENDIF
      ELSE
      addZIP_SetCompressionLevel(2)
      ENDIF
      * 指定壓縮文件的路徑
      addZIP_ArchiveName(sArchive)
      * 檢查需要進行壓縮的文件
      sInclFiles = ALLT(STRTRAN(sInclFiles, ' ', ' '))
      * 建立壓縮文件信息
      addZIP_Include(sInclFiles) && (sInclFiles)
      * 壓縮文件并返回被壓縮的文件數目
      Return addZIP()

      文件解壓縮程序
      * 程序名稱:AUNZIP.PRG
      * 程序說明:在Visual FoxPro中實現文件解壓縮
      * 程序要求:AUNZIP32.DLL放置在Windows的System目錄或當前目錄下
      * 使用方法:AUNZIP(lInitialize, sArchive sDir[, sExtractFiles[, UnZIPparams]])
      * 參數說明:
      * lInitialize:.T. – 第一次使用本程序,.F. – 非第一次使用本程序
      * sArchive: 帶有擴展名的壓縮文件名,如"C:\THISFILE.ZIP"
      * sDir: 目標目錄,如"D:\TEMP"
      * sExtractFiles:需要進行解壓縮的文件名稱[可選],不同文件名之間有一個空格
      * 缺。"*.*"
      * 例1:"C:\CUSTOMER.DBF"
      * 例2:"C:\CUSTOMER.DBF D:\*.TXT D:\DATABASES\*.*"
      * UnZIPparams:壓縮參數[可選]
      * F 文件更新
      * D 包括目錄信息
      * OA 全部覆蓋(缺。
      * O0 不覆蓋
      * OU 提問是否覆蓋
      * S 使用密碼 (必須是最后一部分)
      * 示范語句:AUNZIP(.T., "ZIPFILE", "*.DBF *.TXT Customer.doc")
      * 返回參數:被解壓縮的文件數目,如果沒有指定壓縮文件名則返回-1


      * 接受參數
      PARAMETERS Initialize, sArchive, sDir, sExtractFiles, UnZIPparams
      PRIVATE Params, sTemp
      Params = PARAMETERS()
      * 聲明需要的動態鏈接庫并使當前窗口獲得焦點
      IF Params = 0 OR Initialize
      PRIVATE HWND
      DECLARE INTEGER GetActiveWindow IN win32api
      HWND = GetActiveWindow()
      DECLARE addUNZIP_Initialise IN AUNZIP32
      DECLARE SHORT addUNZIP_SetParentWindowHandle IN AUNZIP32 SHORT @ HWindow
      DECLARE SHORT addUNZIP_ArchiveName IN AUNZIP32 STRING @ sArchName
      DECLARE SHORT addUNZIP_RestoreStructure IN AUNZIP32 SHORT @ nResStr
      DECLARE SHORT addUNZIP_Freshen IN AUNZIP32 SHORT @ nFreshn
      DECLARE SHORT addUNZIP_Include IN AUNZIP32 STRING @ sFileName
      DECLARE SHORT addUNZIP_ExtractTo IN AUNZIP32 STRING @ sExtrTo
      DECLARE SHORT addUNZIP_Register IN AUNZIP32 STRING @ RegName, INTEGER @ RegNum
      DECLARE SHORT addUNZIP_Decrypt IN AUNZIP32 STRING @ sPassw
      DECLARE SHORT addUNZIP_Overwrite IN AUNZIP32 SHORT @ nOvLevel
      DECLARE SHORT addUNZIP IN AUNZIP32
      addUNZIP_Initialise()
      addUNZIP_SetParentWindowHandle(HWND)
      * addUNZIP_Register("RegistrationName", RegistrationNumber)
      * 如果使用的是本動態鏈接庫的注冊版本,則可以添加上面一行
      * 其作用是在壓縮文件中使用密碼保護


      * 如果沒有指定壓縮文件名,則返回0(沒有文件被解壓縮)
      IF Params < 2
      RETURN 0
      ENDIF
      ENDIF
      * 如果沒有指定解壓縮目標目錄,則響鈴并返回0(沒有文件被解壓縮)
      IF Params < 3
      ?? CHR(7)
      MESSAGEBOX('缺少解壓縮參數!',0, 'AUNZip 警告!')
      RETURN 0
      ENDIF
      * 如果存在解壓縮參數,則獲取解壓縮參數
      IF Params > 3
      UnZIPparams = ALLT(UnZIPparams)
      PRIVATE LastPos, PASSWORD, nCurPos
      LastPos = LEN(UnZIPparams) + 1
      * 檢查是否使用密碼
      nCurPos = ATC('S', UnZIPparams)
      IF nCurPos > 0
      cPassWord = SUBSTR(UnZIPparams, nCurPos+1)
      addUNZIP_Decrypt(cPassWord)
      UnZIPparams = LEFT(UnZIPparams, nCurPos -1)
      ENDIF
      * 檢查是否恢復目錄信息
      nCurPos = ATC('D', UnZIPparams)
      IF nCurPos > 0
      addUNZIP_RestoreStructure(1)
      ENDIF
      * 檢查是否進行文件更新
      nCurPos = ATC('F', UnZIPparams)
      IF nCurPos > 0
      addUNZIP_RestoreStructure(1)
      ENDIF
      * 檢查是否覆蓋文件
      DO CASE
      * 全部覆蓋
      CASE 'OA' $ UnZIPparams
      addUNZIP_Overwrite(0x0b)
      * 不覆蓋
      CASE 'O0' $ UnZIPparams
      addUNZIP_Overwrite(0x0c)
      * 提問是否覆蓋
      CASE 'OU' $ UnZIPparams
      addUNZIP_Overwrite(0x0a)
      ENDCASE
      IF nCurPos > 0
      addUNZIP_RestoreStructure(1)
      ENDIF
      ELSE
      addUNZIP_Overwrite(0x000a)
      ENDIF
      * 確認需要解壓縮的壓縮文件名
      addUNZIP_ArchiveName(sArchive)
      * 確認解壓縮目標路徑
      addUNZIP_ExtractTo(ALLT(sDir))
      * 確認需要進行解壓縮的文件
      sExtractFiles = IIF(Params<4, "*.*", ALLT(STRTRAN(sExtractFiles, ' ', ' ')))
      * 構造解壓縮信息
      addUNZIP_Include(sExtractFiles)
      * 解壓縮文件并返回被解壓縮的文件數目
      RETURN addUNZIP()

      [補充說明]
      動態鏈接庫AZIP.DLL和AUNZIP.DLL是NetCom公司英國分部的工程師Stephen Darlington編寫的共享軟件AddZip中的一部分。

      作者:蔣清野
      通訊地址:清華大學23#421 (100084)
      電子郵件:qyjohn@letterbox.com


      日韩精品一区二区三区高清