VB中利用Winrar进行文件压缩 [ 王莉梅  2003年3月24日,阅读人数167人 ]
 
 
 
 
  一些数据库文件(如Access文件)在远程传输过程中可能由于文件比较大而影响传递效果。如果进行压缩以后再传递,会减少传递时间,避免意外的发生,同时也保证了传递效果。我们在压缩文件时,最常用的压缩工具为WinRar和Winzip,笔者在VB编程过程中利用WinRar工具来压缩数据库文件,并完成远程传输,十分方便,在此向大家介绍一下。用WinZip的方法类似。 一、Shell函数 
  Shell函数是VB中的内部函数,它负责执行一个可执行文件,返回一个Variant(Double),如果成功的话,代表这个程序的进程ID,若不成功,则会返回0。   Shell的语法:Shell(PathName[,WindowStyle])。   PathName 为必需参数。类型为String,它指出了要执行的程序名,以及任何需要的参数或命令行变量,也可以包括路径名。   WindowStyle为可选参数。Integer类型,指定在程序运行时窗口的样式。WindowStyle有以下这些值。 常量 值 描述 
VbHide 0 窗口被隐藏,且焦点会移到隐式窗口。 
VbNormalFocus 1 窗口具有焦点,且会还原到它原来的大小和位置。 
VbMinimizedFocus 2 窗口会以一个具有焦点的图标来显示(缺省值)。 
VbMaximizedFocus 3 窗口是一个具有焦点的最大化窗口。 
VbNormalNoFocus 4 窗口会被还原到最近使用的大小和位置,而当前活动的窗口仍然保持活动。 
VbMinimizedNoFocus 6 窗口会以一个图标来显示,而当前活动的窗口仍然保持活动。 二、关于WinRar的用法 
  主要介绍以下如何在WinRar中用命令行来压缩和解压缩文件。   压缩:WINRAR A [-switches] [Files] [@File lists]   例如你想把try.mdb压缩到C盘下,可以WINRAR A C:\try.rar C:\try.mdb   解压缩:如果带目录解压缩       WINRAR X [-switches] [Files] [@File lists] [destionation folder\]       如果在当前目录解压缩,即解压缩时不写目录名       WINRAR E [-switches] [Files] [@File lists] [destionation folder\]   例如你想把try.rar解压缩到C盘下,可以WINRAR X C:\try.rar C:\try.mdb 三、一个例子 
  在VB中新建一个工程,在Form1中添加两个按钮Command1、Command2和Command3,把他们的Caption属性分别设为"压缩文件"、"解压缩文件"和"传递文件"。按Command1时把文件try.mdb压缩成try.rar。   Private Sub Command1_Click()   Dim Rarexe As String 'WINRAR执行文件的位置   Dim Source As String ' 压缩前的原始文件   Dim Target As String ' 压缩后的目标文件   Dim FileString as String 'Shell指令中的字符串   Dim Result As Long     Rarexe="C:\program files\winrar\winrar"   Source="C:\try.mdb"   Target="C:\try.rar"   FileString = rarexe & " a " & Target & " " & Source   Result = Shell(FileString, vbHide)   End Sub   解压的过程类似,按Command2可以把try.rar解压生成 try.mdb。在执行了上面的压缩过程后,可以删除文件try.mdb,来解压缩重新生成try.mdb。   Private Sub Command2_Click()   Dim Rarexe As String 'WINRAR执行文件的位置   Dim Source As String ' 解压缩前的原始文件   Dim Target As String ' 解压缩后的目标文件   Dim FileString as String 'Shell指令中的字符串   Dim Result As Long     Rarexe="C:\program files\winrar\winrar"   Source="C:\try.rar"   Target="C:\try.mdb"   FileString = rarexe & " X " & Source & " " & Target   Result = Shell(FileString, vbHide)   End Sub   文件从一台计算机传输到另一台计算机前,应知道另一台计算机的名字,然后用FileCopy语句就可以了。假设要把压缩后try.rar传递到计算机名为"other"的共享目录"want"下。   Private Sub Command3_Click()   Dim SourceFile, DestinationFile    SourceFile ="C:\try.rar " ' 指定源文件名。    DestinationFile = "\\other\want\try.rar" ' 指定目的文件名。    FileCopy SourceFile, DestinationFile ' 将源文件的内容复制到目的文件中。   End Sub   怎么样,十分简单吧? 
 
 

解决方案 »

  1.   

    如何在服务器端调用winzip命令行对上传的多个文件打包压缩
    2002-2-6  动网先锋  如何在服务器端调用winzip命令行对上传的多个文件打包压缩?要解决这个问题,首先要了解一下Windows Scripting Host,简称为WSH!下面引用一下微软给的解释:
    ************************************************************************
    * WSH是微软脚本技术系列中的一种,简单讲,就是提供了一种脚本环境, *
    * 在这个环境中,预定义了一些对象,同时也可以使用COM里的其他对象。 *
    * 他使用一种脚本引擎来对脚本解释执行,微软自己支持VBSCRIPT和JSCRIPT, *
    * 第三方也可以开发自己的脚本引擎。 *
    ************************************************************************
    具体点,就是你先编好一些脚本文件(微软自带例子若干,后缀.vbs或 .js),
    然后用一个程序对他解释执行,这个程序就叫Windows Scripting Host,程序
    的名字是Wscript.exe(或者命令行的Cscript.exe),你可以查看一下你的机器
    里有没有这两个文件,就知道有没有WSH了。(win2000是在winnt/system32/下)
    这非常像批处理文件,只不过文件里不是命令行,而是脚本语言写的脚本。再来简单介绍一下WSH自带的几个内置对象包括:1.由 Wscript.exe 提供的对象
    Wscript 作为 Wscript 公开给脚本引擎。 
    WshArguments 未公开;通过 Wscript.Arguments 属性访问。 入2.由 WSHom.Ocx 提供的对象。
    WshShell 自动对象。ProgID 是 Wscript.WshShell。 
    (注:这个就是我们要用到的,可以执行dos命令)
    WshNetwork 自动对象。ProgID 是 Wscript.WshNetwork。 
    WshShortcut 未公开;通过 WshShell.CreateShortcut 方法访问。 
    WshUrlShortcut 未公开;通过 WshShell.CreateShortcut 方法访问。 
    WshCollection 未公开;通过 WshNetwork.EnumNetworkDrives 或 WshNetwork.EnumPrinterConnection 方法访问。 
    WshEnvironment 未公开;通过 WshShell.Environment 属性访问。 
    WshSpecialFolders 未公开;通过 WshShell.Folder 属性访问。 他们主要可以完成环境变量的获取,网络登陆,驱动器映射,快截方式创建,
    程序加载,特殊文件夹(如系统文件夹)信息获取等功能。如果你的系统里支持ADO等COM部件,你同样可以使用,
    下面这个例子演示打开写字板查看文本文件,同时创建一个文本文件并写入一
    段话,你可以把他拷贝到写字板中,然后以.vbs为后缀存盘,之后双击他,'test.vbs
    '*********************
    '下面用SHELL对象启动程序
    '*********************
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    WshShell.Run ("notepad " & Wscript.ScriptFullName)
    '***********************************************
    '用COM对象Scripting.FileSystemObject操作文本文件
    '***********************************************
    Set fs = Wscript.CreateObject("Scripting.FileSystemObject")
    Set a = fs.CreateTextFile("c:\testfile.txt", True)
    a.WriteLine("这是一个测试。")
    a.Close也可以在asp等web编程语言中应用
    <script language="VBScript.Encode" runat=server>
    '上面用SHELL对象启动程序
    Set WshShell = server.CreateObject("Wscript.Shell")
    IsSuccess = WshShell.Run ("D:\winnt\system32\cmd.exe" ,1, true)
    if IsSuccess = 0 Then 
    Response.write " 命令成功执行!"
    else 
    Response.write " 命令执行失败!权限不够或者该程序无法在DOS状态下运行"
    end if
    </script>
    注:
    1.其中runat=server必须要有
    2.Set WshShell = Wscript.CreateObject("Wscript.Shell")
    要改为Set WshShell = server.CreateObject("Wscript.Shell"),
    3.参数1代表SW_SHOWNORMAL, 激活并显示一个窗口。若窗口是最小化或最大化,则恢复到其原来的大小和位置。 
    4.TRUE代表返回执行的错误,False或者为指定代表脚本继续执行而不等待进程结束。
    5.调用WSH的内置对象了,可以象调用函数和过程一样。
    如call WshShell.Run ("D:\winnt\system32\cmd.exe" ,1, true)如果你对WSH感兴趣,想了解更多的话,请察看
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/wsconwshbasics.asp
    http://www.dev-club.com/club/bbs/showEssence.asp?id=11136现在我们言归正传来看看如何对文件进行压缩和解压!
    大家都知道winzip对文件解压和压缩都易如反掌,但是如何通过程序和命令行对其调用呢?
    当然winzip的作者已经开发出
    WinZip Command Line Support Add-On Version 1.0 
    大家去可以去http://www.winzip.com/wzcline.htm 下载wzcline.exe!
    前提是本机须安装winzip8.0或更高版本的支持,如果你不是winzip8.0,去
    http://www.winzip.com/download.htm 下载!下载后,直接安装就可以!
    就会在winzip的目录中产生winzip命令行帮助文件和程序WZZIP.exe,WZUNZIP.EXE。
    你可以开始运行里调用:
    如:"c:\program files\winzip\wzzip" myfile.zip
    也可以拷贝这里两个文件到任意目录下,直接在dos窗口下运行
    如:wzzip.exe myfile.zip
    你可以在系统的环境变量里加入set path=c:\windows;c:\program files\winzip;
    就可以在任何地方不用加入路经调用了!现在来简单的了解一下帮助中两个命令的基本用法
    压缩文件用 WZZIP.exe :
    通用格式:wzzip [options] zipfile [@listfile] [files...]
    [options]包括:
    -a 默认的操作,压缩文件
    -a+ 压缩文件,并删除要压缩的文件
    -b[drive|path] 是在另外的驱动器上创建临时压缩文件
    -d 删除zip文件中指定的目标文件
    -e<x|n|f|s|0> 是设置压缩比率,x最大,0最小
    -f 替换zip文件中存在的文件
    -h|-? 察看帮助
    -v 创建一个压缩文件的列表信息
    -@list 先创建一个包含所有要解压的文件的文件,然后按所包含的的文件名压缩
    ...............(其他具体看帮助文件)
    [@listfile] 是压缩文件的列表信息纪录
    [files...] 则是要压缩的多个文件,用空格隔开,也可以用通配符例:
    压缩当前目录的所有文件 
    wzzip test.zip *.*
    压缩类型为txt的所有文件 
    wzzip test.zip *.txt
    压缩两个文件 
    wzzip test.zip abc.txt def.txt
    压缩类型为txt的所有文件除了abc.txt 
    wzzip -xABC.TXT test.zip *.txt
    压缩D:\docs下的所有类型为txt的文件及子目录 
    wzzip -rp test.zip d:\docs\*.txt
    把zipit.1st里的文件更新到test.zip 
    wzzip -u test.zip @Zipit.lst
    列出一个压缩文件的列表内容
    wzzip -v test.zip
    解压文件用WZUNZIP.exe :
    通过格式:wzunzip [options] zipfile [@listfile] [path] [files...]
    [options]包括:
    -c[m] 解压是显示文件列表在dos屏幕中
    -d 重建zip文件中的目录结构
    -f 只解压在zip文件里同目前文件夹存在的同名的文件,如果没有则不解压
    -jhrs 忽视zip文件里的文件的隐藏、只读、系统属性
    -Jhrs 只解压带有隐藏、只读、系统属性的文件
    -n 只解压叫新的文件,如果要解压的文件比已存在的新则替换。
    -o 不用通过yes来确定是否要替换文件
    -v 创建一个压缩文件的列表信息
    -@list 先创建一个包含所有要解压的文件的文件,然后按所包含的的文件名解压
    ...............(其他具体看帮助文件)
    例如:
    创建所有文件到当前目录下
    wzunzip test.zip
    从test.zip中创建abc.txt到当前目录下
    wzunzip test.zip abc.txt
    创建在test.zip中的目录结构及文件到当前目录下
    wzunzip -d test.zip
    创建在test.zip中的目录结构及文件到c:\docs下
    wzunzip -d test.zip c:\docs从test.zip中创建包含在files.ist中的文件名的文件
    wzunzip test.zip @files.lst
    显示test.zip的文件列表内容
    wzunzip -v test.zip
    显示压缩文件中所有类型为txt的文件列表内容
    wzunzip -v test.zip *.txt
    有了以上的准备,那么我们现在来编写VBS来执行文件解压和压缩就易如反掌了:
    'test.vbs
    '*********************
    '上面用SHELL对象启动程序
    '*********************
    Set WshShell = Wscript.CreateObject("Wscript.Shell")
    WshShell.Run ("c:\wzzip.exe c:\test.zip c:\a.txt c:\b.txt")
    'test.asp
    '*********************
    '上面用SHELL对象启动程序
    '*********************
    <script language="VBScript.Encode" runat=server>
    '上面用SHELL对象启动程序
    Set WshShell = server.CreateObject("Wscript.Shell")
    IsSuccess = WshShell.Run (" c:\wzzip.exe c:\test.zip c:\a.txt c:\b.txt" ,1, true)
    if IsSuccess = 0 Then 
    Response.write " 命令成功执行!"
    else 
    Response.write " 命令执行失败!权限不够或者该程序无法在DOS状态下运行"
    end if
    </script>
    怎么样很简单吧,如果我们再把文件上传和此结合起来,就会产生很多使用的功能。如:
    在用上传组件上传多个文件后,可以对其多个文件打包,以提供给其他人zip文件下载
    或者上传一个zip文件后,可以利用程序对其解压,以提供给其他人单个文件下载
    很方便用户吧!我会在以后的文章里把这两种变化写出来!文中难免有疏漏的地方,请大家多多指正!
    以上的例子均在win2000+iis5.0上测试过!  
      

  2.   

    希望对你有帮助,把vb的转为asp.net的表述看看
      

  3.   

    TO:atian25(阿天) 
    谢谢,根据你的思路,我做了一个
    不过我是调用rar.exe命令来压缩的。
    再次谢谢你