ARJ 是一种用于创建和管理.arj 压缩包的工具,以下是网上关于它的详细介绍:
基本介绍
ARJ 是一种流行于 DOS 和 Windows 系统下的文件压缩格式,由 Robert K. Jung 开发。ARJ 压缩工具在 20 世纪 80 年代末到 90 年代初非常流行,常用于将多个文件或目录压缩成一个单独的.arj 文件,以节省存储空间和方便文件传输。
功能特点
高压缩比:ARJ 采用了高效的压缩算法,能够将文件压缩到较小的体积,在当时的压缩工具中,其压缩比相对较高,对于一些文本文件、程序文件等能实现较好的压缩效果。
支持多种操作系统:虽然最初是为 DOS 系统开发的,但后来也有了 Windows 版本,使其可以在不同的操作系统环境下使用,方便了不同用户之间的文件交换和共享。
分卷压缩:可以将一个大的文件或目录压缩成多个较小的分卷文件,每个分卷文件的大小可以根据需要进行设置。这在当时软盘等存储介质容量有限的情况下非常实用,用户可以将分卷文件分别存储在不同的软盘上,便于携带和传输。
加密功能:支持对压缩包中的文件进行加密,用户可以设置密码,只有输入正确的密码才能解压文件,从而保护文件的安全性和隐私性。
虽然 ARJ 在现代的文件压缩领域已经逐渐被 ZIP、RAR 等更先进的压缩格式所取代,但在一些特定的历史场景和旧系统中,仍然可能会遇到.arj 压缩包,了解 ARJ 的基本使用方法和特点,有助于处理这些遗留文件。
这个软件当时是shareware,无意中发现,现在有了开源的版本,位于https://arj.sourceforge.net/。就想在aarch64 Linux上编译试试看。
步骤
- 下载源代码 https://arj.sourceforge.net/files/arj-3.10.22.tar.gz
- 解压缩到/par/arj-3.10.22
- 编译
按照doc/compile文档的说明,Linux系统执行"cd gnu; autoheader; autoconf; ./configure; cd …"
但是报错了,而且不知道错在哪步,将上述命令分别执行,知道错在哪一步了。就是最后一步./configure报错
configure.in:160: the top level
checking for a BSD-compatible install... /usr/bin/install -c
checking build system type... Invalid configuration `aarch64-pc-linux-gnu': machine `aarch64-pc' not recognized
configure: error: /bin/bash ./config.sub aarch64-pc-linux-gnu failed
这个错误前不久编译其他库时遇到过,config.sub太旧了,2005年的,不识别当前系统,正好上次下载了最新的config.sub,用它替换旧的,./configure就能顺利完成了
在/par/arj-3.10.22下生成了GNUmakefile,compile文档说要执行gmake,结果系统中没有这个命令,又参考了其他库的安装,用make --makefile GNUmakefile代替。
在编译fardata.c的地方报错如下:
fardata.c:193:12: error: conflicting types for ‘strnlen’
static int strnlen(const char FAR *s, int count)
^
In file included from environ.h:99:0,
from arj.h:13,
from fardata.c:8:
/usr/include/string.h:413:15: note: previous declaration of ‘strnlen’ was here
extern size_t strnlen (const char *__string, size_t __maxlen)
^
In file included from arj.h:14:0,
from fardata.c:8:
fardata.c: In function ‘flush_cbuf’:
与系统库的同名函数冲突了,参数类型和返回值还不一样。在源代码中搜了一下,只有这一处调用这个函数,就把定义和调用都改成arj_strnlen,重新make,虽然还有其他报错,但已经生成了二进制文件,位于linux-gnu/en/rs/arj/arj。
输出的日志最后部分如下
./linux-gnu/en/rs/arj/arj a ./linux-gnu/en/rs/help.arj -+ -t1f -2e -e -jm -jh65535 -jt ./resource/en/arj?.txt
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]
Creating archive : ./linux-gnu/en/rs/help.arj
Adding ./resource/en/arjl.txt 37.2%
Adding ./resource/en/arjs.txt 47.3%
Testing OK
Testing OK
2 file(s)
./linux-gnu/en/rs/tools/join ./linux-gnu/en/rs/arj/arj ./linux-gnu/en/rs/help.arj
JOIN v 1.30 [26/04/2003] Not a part of any binary package!
Copying . done!
./linux-gnu/en/rs/tools/postproc linux-gnu/en/rs/arj/arj
POSTPROC v 1.30 [17/01/2003] Not a part of any binary package!
Patch not found
GNUmakefile:347: recipe for target 'linux-gnu/en/rs/arj/arj' failed
make[1]: *** [linux-gnu/en/rs/arj/arj] Error 3
make[1]: Leaving directory '/shujv/par/arj-3.10.22'
GNUmakefile:169: recipe for target 'all' failed
make: *** [all] Error 2
最后一步好像是打补丁,但没找到补丁。
4. 测试
刚才在make过程中,输出的日志中已经包括arj a命令的测试,都PASS了。看起来压缩功能是能用的,但是其他命令,列表,解压等统统出错,我用自己的文件测试也是一样
/shujv/par/arj-3.10.22$ linux-gnu/en/rs/arj/arj l linux-gnu/en/rs/help.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]
Processing archive: linux-gnu/en/rs/help.arj
Exceeded chapter limit of 250
arj-3.10.22/arj a test.arj -jt myzip.c
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]
Creating archive : test.arj
Adding myzip.c 27.3%
Testing OK
1 file(s)
arj-3.10.22/arj a test.arj -jt test_arj.txt
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]
Updating archive : test.arj
Archive created: 2025-09-01 14:11:01, modified: 2025-09-01 14:11:01
Adding test_arj.txt 23.8%
Testing OK
Testing OK
1 file(s)
1 comment(s)
arj-3.10.22/arj l test.arj -jt
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [01 Sep 2025]
Processing archive: test.arj
Exceeded chapter limit of 250
arj就像个黑洞,只有a命令好使,添加文件都行,但l命令都不行,那个test ok,带有-jt是压缩过程中测试的,并不是测最终生成的文件。报错也莫名其妙,Exceeded chapter limit of 250,都不知是什么意思。
后来我通过注释fardata.c中的strnlen源代码,让它调用系统库函数的方法又试了一次,编译得的二进制文件也是一样的问题,看来问题不在这里。
在网上查找问题,有新发现,这个arj工具可以用apt install arj安装。
我安装了后,用安装的版本测试编译版本生成的压缩包,这次有内容了:
arj l sheet1.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [19 Jan 2016]
Processing archive: sheet1.arj
Archive created: 2025-09-01 14:30:33, modified: 1970-01-01 08:00:00
Filename Original Compressed Ratio DateTime modified Attributes/GUA BPMGS
------------ ---------- ---------- ----- ----------------- -------------- -----
250704975 0 0.000 79-12-31 00:00:00 ---xr--r-- --- 1
Bad header
它说文件头坏,再看列出的字段也不完整,内容也不对,所以不能用,但依然不理解我编译的版本为什么不输出这个信息。
再用安装版本重新压缩一份,这次列表、解压缩都正确了。
time arj a sheet1a.arj dknyc/xl/worksheets/sheet1.xml
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [19 Jan 2016]
Creating archive : sheet1a.arj
Adding dknyc/xl/worksheets/sheet1.xml 14.6%
1 file(s)
real 1m10.861s
user 1m10.100s
sys 0m0.616s
/shujv/par$ arj l sheet1a.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [19 Jan 2016]
Processing archive: sheet1a.arj
Archive created: 2025-09-01 14:47:23, modified: 2025-09-01 14:47:23
Filename Original Compressed Ratio DateTime modified Attributes/GUA BPMGS
------------ ---------- ---------- ----- ----------------- -------------- -----
sheet1.xml 1717888301 250704975 0.146 79-12-31 00:00:00 -rw-rw-r-- --- +1
------------ ---------- ---------- -----
1 files 1717888301 250704975 0.146
/shujv/par$ arj e sheet1a.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [19 Jan 2016]
Processing archive: sheet1a.arj
Archive created: 2025-09-01 14:47:23, modified: 2025-09-01 14:47:23
Extracting dknyc/xl/worksheets/sheet1.xml to sheet1.xml OK
1 file(s)
/shujv/par$ ls -l sheet1.xml
-rw-rw-r-- 1 kylin kylin 1717888301 12月 31 1979 sheet1.xml
看这个压缩比和压缩时间,确实和现代的其他压缩工具不能比,zstd又快又小,gzip压缩包大小差不多,时间大约只要arj的一半。
time zstd -k dknyc/xl/worksheets/sheet1.xml
dknyc/xl/worksheets/sheet1.xml : 11.52% ( 1.60 GiB => 189 MiB, dknyc/xl/worksheets/sheet1.xml.zst)
real 0m4.034s
user 0m8.600s
sys 0m0.868s
time gzip -k dknyc/xl/worksheets/sheet1.xml
real 0m43.089s
user 0m42.392s
sys 0m0.472s
/shujv/par$ ls -l dknyc/xl/worksheets/sheet1.xml.gz
-rw-rw-r-- 1 kylin kylin 249525531 12月 31 1979 dknyc/xl/worksheets/sheet1.xml.gz
补记:
来自https://github.com/joncampbell123/arj的修改版本源码可以在aarch64 Linux编译成功,包括Kylin Linux和安卓的termux+proot。
奇怪的是,在Kylin Linux上,单独输入arj的路径不能显示使用说明,而在docker容器中却可以。压缩、解压文件在两个环境都可以。
/shujv/par/arj-master$ linux-gnu/en/rs/arj/arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [02 Sep 2025]
Can't find linux-gnu/en/rs/arj/arj
Found 1 error(s)!
/shujv/par/arj-master$ linux-gnu/en/rs/arj/arj a ../a2.arj ../test_range2.sql
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [02 Sep 2025]
Creating archive : ../a2.arj
Adding ../test_range2.sql 92.3%
1 file(s)
/shujv/par/arj-master$ linux-gnu/en/rs/arj/arj e ../sheet1.arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [02 Sep 2025]
Processing archive: ../sheet1.arj
Archive created: 2025-09-02 08:17:41, modified: 2025-09-02 08:17:41
Extracting dknyc/xl/worksheets/sheet1.xml to sheet1.xml OK
1 file(s)
#进入容器
sudo docker exec -it gcc bash
root@66d4e20ec1d7:/# cd /par/arj-master
root@66d4e20ec1d7:/par/arj-master# linux-gnu/en/rs/arj/arj
ARJ32 v 3.10, Copyright (c) 1998-2004, ARJ Software Russia. [02 Sep 2025]
Processing archive: linux-gnu/en/rs/arj/arj
Archive created: 2025-09-02 08:04:02, modified: 2025-09-02 08:04:02
List of frequently used commands and switches. Type ARJ -? for more help.
Usage: ARJ <command> [-<sw> [-<sw>...]] <archive_name> [<file_names>...]
Examples: ARJ a -e archive, ARJ e archive, ARJ l archive *.doc
2166

被折叠的 条评论
为什么被折叠?



