开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 3802|回复: 18
收起左侧

[易语言] 自解压文件怎样弄?

[复制链接]
结帖率:0% (0/3)
发表于 2011-4-3 03:06:38 | 显示全部楼层 |阅读模式   广东省佛山市
10精币
3.jpg 如何用易语言生成像rar自解压文件,要有解压后运行某个文件或程序,自定义EXE图标,解压到临时文件夹,静态隐匿解压自动更新替换。就像用rar做单文件软件那样!望指教~
1.jpg 4.jpg 2.jpg


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:67% (12/18)
发表于 2011-4-3 07:14:14 | 显示全部楼层   辽宁省沈阳市
我们先来了解一下自解压文件,在window下可以用自解压制作工具如winzip self-Extractor来制作自解压文件,这些工具会把一个zip文件与解压程序打包在一起而产生一个新的可执行文件。然后只要运行这个可执行文件,就可以把zip文件中的内容解开。那为什么要创建自解压jar文件呢,创建成自解压zip文件不就好了?我们应该注意到自解压jar文件可以在任意支持java的平台上解开并执行,例如,可以在linux下执行。创建jar自解压文件很简单,只需要一个特殊的JAR manifest文件、一个基于java的解压程序、包含基本文件的jar 或者zip文件以及任何jsdk的jar应用程序

manifest文件

要生成可执行jar文件,需要在META-INF 目录下的manifest文件,文件名为:MANIFEST.MF ,但在我们这里我们只需要在文件中指定在这个基于java 的解压程序中包含main的类的名称:Main-Class: ZipSelfExtractor

我们已经把一个叫做jarmanifest的文件加入到这个技巧的源程序包中。

解压程序

你可以用各种方法来实现这个解压程序,在我们这里使用了一个简单直接的办法。首先,解压程序判断这个自解压jar文件的名称,有了这个文件名,解压程序使用解压标准,把文件解开。具体的可以查看在源码包中的ZipSelfExtractor.java文件。

值得一提的是这里用了一个很巧妙的办法获取jar文件的文件名,虽然在命令行中出现的这个文件的名字,但它并没有作为参数传入类的main中,因此,这里使用了以下的代码来获取文件名:

private String getJarFileName

{

myClassName = this.getClass.getName + ".class";

URL urlJar =

this.getClass.getClassLoader.getSystemResource;

String urlStr = urlJar.toString;

int from = "jar:file:".length;

int to = urlStr.indexOf;

return urlStr.substring;

}

请注意:getSystemResource 中使用了myClassName而不是ZipSelfExtractor.class作参数,这使得我们可以更改加压程序的名字而不需要修改代码。

接下来,我们来分析获得这个jar文件的名字。首先,可以获取指向包含正在运行类的文件,urlStr = urlJar.toString;有了这个url,把jar文件名去掉,剩下的就是我们想要的,下面是这个url的格式:

jar:file:/home/test/zipper.jar!/ZipSelfExtractor.class

有了文件名,就可以开始解压,详细的解压算法请大家自己看源码。

为了可以更方便实用,程序使用了图形界面,程序中使用了JFileChooser类可以选择要解压的目标目录。

最后程序还确保不把这两个文件:manifest文件和extractor´s .class(在我们这里是ZipSelfExtractor.class)文件也解出来,程序是用来解开原始的jar的内容,而这两个文件并属于jar原始内容。

打包jar文件

有了manifest文件与解压程序,我们就可以创建自解压jar文件了,以下是一个例子:

1.创建一个zip文件Myzip.zip

2.下载zipper.jar

3.把文件解到当前目录,准备制作自解压jar文件

java -jar zipper.jar

4.把zipper.class拷贝成 ZipSelfExtractor.class

5.把 myzip.zip 重命名为 myzip.jar

6.把myzip.jar中的内容替换为jarmanifest和ZipSelfExtractor.class这两个文件

jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class

7.执行java -jar myzip.jar就可以看到效果了,试试看

后记

一个自解压的jar文件能够很好的跨平台使用,自解压jar文件创建简单,只需要有jre1.2或或者更新的版本就可以实现了。

附自解压程序的源代码:

/* ZipSelfExtractor.java */

/* Author: Z.S. Jin

Updates: John D. Mitchell */

import java.io.*;

import java.net.*;

import javax.swing.*;

import java.util.zip.*;

import java.util.*;

import java.text.*;

public class ZipSelfExtractor extends JFrame

{

private String myClassName;

static String MANIFEST = "META-INF/MANIFEST.MF";

public static void main

{

ZipSelfExtractor zse = new ZipSelfExtractor;

String jarFileName = zse.getJarFileName;

zse.extract;

System.exit;

}

ZipSelfExtractor

{

}

private String getJarFileName

{

myClassName = this.getClass.getName + ".class";

URL urlJar = this.getClass.getClassLoader.getSystemResource;

String urlStr = urlJar.toString;

int from = "jar:file:".length;

int to = urlStr.indexOf;

return urlStr.substring;

}

public void extract

{

File currentArchive = new File;

JFileChooser fc = new JFileChooser;

fc.setCurrentDirectory);

fc.setDialogType;

fc.setDialogTitle);

fc.setMultiSelectionEnabled;

fc.setFileSelectionMode;

if

!= JFileChooser.APPROVE_OPTION)

{

return; only when user select valid dir, it can return approve_option

}

File outputDir = fc.getSelectedFile;

byte[] buf = new byte[1024];

SimpleDateFormat formatter = new SimpleDateFormat );

ProgressMonitor pm = null;

boolean overwrite = false;

ZipFile zf = null;

FileOutputStream out = null;

InputStream in = null;

try

{

zf = new ZipFile;

int size = zf.size;

int extracted = 0;

pm = new ProgressMonitor, "Extracting files...", "starting", 0, size-4);

pm.setMillisToDecideToPopup;

pm.setMillisToPopup;

Enumeration entries = zf.entries;

for

{

ZipEntry entry =entries.nextElement;

if)

continue;

String pathname = entry.getName;

ifMANIFEST.equals))

continue;

extracted ++;

pm.setProgress;

pm.setNote;

if)

return;

in = zf.getInputStream;

File outFile = new File;

Date archiveTime = new Date);

if

{

if)

{

Object[] options = {"Yes", "Yes To All", "No"};

Date existTime = new Date);

Long archiveLen = new Long);

String msg = "File name conflict: "

+ "There is already a file with "

+ "that name on the disk!“n"

+ "“nFile name: " + outFile.getName

+ "“nExisting file: "

+ formatter.format + ", "

+ outFile.length + "Bytes"

+ "“nFile in archive:"

+ formatter.format + ", "

+ archiveLen + "Bytes"

+"“n“nWould you like to overwrite the file?";

int result = JOptionPane.showOptionDialog;

if No

{

continue;

}

else if YesToAll

{

overwrite = true;

}

}

}

File parent = new File);

if )

{

parent.mkdirs;

}

out = new FileOutputStream;

while

{

int nRead = in.read;

if

break;

out.write;

}

out.close;

outFile.setLastModified);

}

pm.close;

zf.close;

getToolkit.beep;

JOptionPane.showMessageDialog

? "s": "") +

" from the“n" +

zipfile + "“narchive into the“n" +

outputDir.getPath +

"“ndirectory.",

"Zip Self Extractor",

JOptionPane.INFORMATION_MESSAGE);

}

catch

{

System.out.println;

if { try { zf.close; } catch {;} }

if { try {out.close;} catch {;} }

if { try { in.close; } catch {;} }

}

}

}
回复

使用道具 举报

结帖率:67% (2/3)
发表于 2011-4-3 12:07:03 | 显示全部楼层   广东省佛山市
这个不难.
但感觉楼主是在做一些见不得人的程序....
还是不好说了
回复

使用道具 举报

发表于 2011-4-3 12:08:56 | 显示全部楼层   广东省江门市
好难哦!!!!!!!!!
回复

使用道具 举报

结帖率:0% (0/3)
 楼主| 发表于 2011-4-3 22:21:36 | 显示全部楼层   广东省佛山市
回复 3# fsjoe


    不是,我的软件要用到一个数据库文件,想通生成自解压文件保持软件只有一个单文件!不能用资源写到文件,因为我要数据库文件是更新的!不是想干别的~请赐教~
回复

使用道具 举报

结帖率:67% (2/3)
发表于 2011-4-3 22:35:05 | 显示全部楼层   广东省佛山市
回复  fsjoe


    不是,我的软件要用到一个数据库文件,想通生成自解压文件保持软件只有一个单文件! ...
ruff 发表于 2011-4-3 22:21


如果是数据库文件,我建议你使用动态建库方式.
在打开数据库前检查数据库是否存在,不存在就直接建库
回复

使用道具 举报

结帖率:0% (0/3)
 楼主| 发表于 2011-4-4 00:04:12 | 显示全部楼层   广东省佛山市
回复 6# fsjoe


  问题是我的数据库文件是更新的,不能用判断文件是否存在而建立,这样只可以是初始数据!我想通过压缩来更新后的数据文件再统一成一个单文件!
回复

使用道具 举报

结帖率:67% (2/3)
发表于 2011-4-4 09:53:58 | 显示全部楼层   广东省佛山市
本帖最后由 fsjoe 于 2011-4-4 09:55 编辑
回复  fsjoe


  问题是我的数据库文件是更新的,不能用判断文件是否存在而建立,这样只可以是初始数据 ...
ruff 发表于 2011-4-4 00:04


"我的数据库文件是更新的"是什么意思? 是不是指数据库里是有数据的?
还是指要临时从网上下载?
文件很大?一定需要压缩?
RAR的自解压文件其实就可以满足你的要求了,
在为你的软件生成安装程序时,把数据库也打包进去
这样在安装程序时一块安装数据库文件就行.
回复

使用道具 举报

结帖率:0% (0/3)
 楼主| 发表于 2011-4-5 21:47:22 | 显示全部楼层   广东省佛山市
回复 8# fsjoe



    rar自解压就是我想要的,不过我想什么用易语言才能做成这种效果!!每当检测到程序关闭时就生成自解压文件~
回复

使用道具 举报

结帖率:67% (2/3)
发表于 2011-4-6 01:00:43 | 显示全部楼层   广东省佛山市
方法是有的,给你思路
把RAR.EXE放入程序中
在程序运行中释放出来.
再用DOS参数方式生成自解压文件.
具体参数请看 RAR /?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表