关于7z的命令行操作
来源:互联网 发布:silverlight调用js 编辑:程序博客网 时间:2024/06/05 05:45
7z命令行调用文档
目前找到最靠谱的是这篇。
还有这个博客。
从压缩包提取指定文件
选择主命令
本需求相关的是有 e 和 x 命令。
因为e 是针对当前目录操作,所以只能用x命令。
x命令支持全路径操作,所以选定它。
指定输出目录
经过阅读文档,需要使用“-o”命令,其后指定输出路径。
指定要提取的文件
因为需要从压缩包内提取指定的文件,所以就需要配合使用过滤的命令。
一种解决方案
经过阅读文档,发现可以使用“-i”命令,其后跟要解压的文件过滤字符。完整的调用如下:
7z.exe x C:\Users\yourname\Desktop\test\book.zip -oC:\Users\yourname\Desktop\test\out i book\book.pdf
以上的语句把“C:\Users\yourname\Desktop\test\book.zip”这个压缩文件中“book\book.pdf”文件解压在了“C:\Users\yourname\Desktop\test\out”。解压后,该pdf文件的全路径为:“C:\Users\yourname\Desktop\test\out\book\book.pdf” 。本意想把pdf文件解压在“C:\Users\yourname\Desktop\test\out\”路径下(也就是多了一层目录),但没有找到解压方法。另外,写成代码调用时,这个命令没有生效。
另外一种解决方案
在“-o”指定的路径后,添加过滤字符串。一下的代码实现的效果和上述代码一样:
C:\Users\yourname\Desktop>7z.exe x C:\Users\yourname\Desktop\test\book.zip -oC:\Users\yourname\Desktop\test\out *.pdf -r
上述代码的含义是,从压缩包中过滤所有后缀为pdf的文件,递归子目录。如果去掉后面的“-r”,就只会在压缩包的一级目录内寻找。因为可以确定压缩包内只有一个pdf文件,所以最终采用了这个方式。完整的调用代码如下:
private function getFileFromZip(zipFile:File,getFileName:String,saveFilePath:String):void{ var np:NativeProcess = new NativeProcess(); var args:Vector.<String> = new Vector.<String>; args.push("x"); args.push(zipFile.nativePath);// 压缩包文件的路径 args.push("-o"+saveFilePath);// 输出目录 args.push(getFileName);// 从压缩包内寻找的文件过滤字符串 args.push("-r");// 递归查找文件 var exeFilePath:String=File.applicationDirectory.resolvePath("bins/7z.exe").nativePath; var exeFile:File=new File(exeFilePath); var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo(); nativeProcessStartupInfo.executable = exeFile; nativeProcessStartupInfo.arguments = args; np.addEventListener(Event.STANDARD_OUTPUT_CLOSE,unzipEpubCompleted); np.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorHandler); np.start(nativeProcessStartupInfo); }private function unzipEpubCompleted(e:Event):void{ var np:NativeProcess = e.target as NativeProcess; np.removeEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorHandler); np.removeEventListener(Event.STANDARD_OUTPUT_CLOSE, unzipEpubCompleted); np.exit(); // doSth else}private function onErrorHandler(event:ProgressEvent):void{ var np:NativeProcess = event.target as NativeProcess; np.removeEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorHandler); np.removeEventListener(Event.STANDARD_OUTPUT_CLOSE, unzipEpubCompleted); np.exit();}
调用7z进行压缩无响应的问题
症状
经过反复测试发现症状是:要压缩的文件多于一定数量后,就不再抛出标准输出事件了,后续的事件也不不抛出,压缩文件有时可以完成,有时只是一个空壳。和要压缩的文件大小没有直接关系,放入大文件没有问题。
目前的解决方案
在监听的标准输出事件中,读取输出据,如果需要可以输出到后台或日志中。
具体的做法:
private function onOutputData(e:ProgressEvent):void{ trace(e.toString()); var prop:NativeProcess=e.currentTarget as NativeProcess; var byts:ByteArray=new ByteArray(); var str:String = prop.standardOutput.readUTFBytes(prop.standardOutput.bytesAvailable); trace(str);}
尝试解释上述解决方案
7z的输出内容占用某个缓冲区域,在缓冲区域被占满后,就不再有标准输出事件抛出,影响后续事件的抛出。上述接近方案其实是在一直不断的清空缓冲区。
猜想其他的解决方案
让7z调用不输出具体的操作细节。(还没找到解决方法。)
- 关于7z的命令行操作
- 7z 的命令行
- 7z 的命令行
- 7z 的命令行
- 7z命令行操作指南之解压缩
- 7z在mac上的命令行
- 7z 命令行 解压 分卷的压缩文件
- 7z命令行操作指南之最快压缩
- 7Z命令行
- 7z命令行
- 7Z命令行
- 7Z命令行
- 7z命令行
- 7Z命令行详解
- 7z 命令行详解
- 7z 压缩解压工具使用--命令行
- 命令行压缩解压缩一 7z
- 7z 压缩解压工具使用--命令行
- Android禁止输入表情符号
- iOS 视频压缩、音视频混合、音频混合
- SE02 Unit04 多线程基础
- thinkphp3.2.3 成功对接支付宝接口
- codeforces D 287 Shifting
- 关于7z的命令行操作
- PAT乙级真题及训练集--1001. 害死人不偿命的(3n+1)猜想 (15)
- script.sh
- 大二总结
- Python 装饰器
- HTML入门
- TCP、UDP数据包大小的限制
- WebSocket和kafka实现数据实时推送到前端
- Kubernetes基金会托管容器网络CNI