从命令行压缩-如何修剪路径元素

如何解决从命令行压缩-如何修剪路径元素

| 我正在使用NSTask从我的应用程序中执行一个zip命令。它作为参数传递了一些路径,这些路径指向要压缩的文件/文件夹。 问题在于,如果没有-j选项,则最终的zip最终会在zip中以荒谬的文件路径结尾(例如\“ / private / var / folders / A5 / A5CusLQaEo4mop-reb-SYE +++ TI / -Tmp- / 9101A216 -5A6A-4CD6-A477-E4B86E007476-51228-00014BCB9514323F / myfile.rtf \“)。但是,如果添加-j选项,则如果嵌套文件夹深处的任何文件具有 我已经尝试在执行NSTask之前设置路径:
[[NSFileManager defaultManager] changeCurrentDirectoryPath:path];
希望zip文档能说明事实:   默认情况下,zip将存储完整路径                 (相对于当前目录) 但这没有按预期工作。调整-j和-p和-r的设置仅会以不同的组合产生上述问题。 题: 我该如何选择一组目录 /some/long/path/sub1/file1.txt /some/long/path/sub2/file1.txt 并将其压缩为内容为 /sub1/file1.txt /sub2/file1.txt 感谢您对zip精妙之处的任何建议。 - - -编辑 我忘记添加的另一件事是传递的原始目录是\“ path \”,因此在我看来,期望的结果也是期望的结果。     

解决方法

        代替
[[NSFileManager defaultManager] changeCurrentDirectoryPath:path];
在启动任务之前使用
-[NSTask setCurrentDirectoryPath:]
。例如:
NSString *targetZipPath = @\"/tmp/foo.zip\";
NSArray *args = [NSArray arrayWithObjects:@\"-r\",targetZipPath,@\"sub1\",@\"sub2\",nil];
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@\"/usr/bin/zip\"];
[task setArguments:args];

// set path to be the parent directory of sub1,sub2
[task setCurrentDirectoryPath:path];
…
    ,        这不是一个通用的解决方案,因为它不能很好地处理多个目录,但是我用于未知目录(即混合文件/文件夹/捆绑包)的单个目录的解决方案是枚举目录,然后将其作为zip的参数分别添加,而不是一次压缩整个目录。 特别:
+ (BOOL)zipDirectory:(NSURL *)directoryURL toArchive:(NSString *)archivePath;
{
//Delete existing zip
if ( [[NSFileManager defaultManager] fileExistsAtPath:archivePath] ) {
    [[NSFileManager defaultManager] removeItemAtPath:archivePath error:nil];
}

//Specify action
NSString *toolPath = @\"/usr/bin/zip\";

//Get directory contents
NSArray *pathsArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[directoryURL path] error:nil];

//Add arguments
NSMutableArray *arguments = [[[NSMutableArray alloc] init] autorelease];
[arguments insertObject:@\"-r\" atIndex:0];
[arguments insertObject:archivePath atIndex:0];
for ( NSString *filePath in pathsArray ) {
    [arguments addObject:filePath]; //Maybe this would even work by specifying relative paths with ./ or however that works,since we set the working directory before executing the command
    //[arguments insertObject:@\"-j\" atIndex:0];
}

//Switch to a relative directory for working.
NSString *currentDirectory = [[NSFileManager defaultManager] currentDirectoryPath]; 
[[NSFileManager defaultManager] changeCurrentDirectoryPath:[directoryURL path]];
//NSLog(@\"dir %@\",[[NSFileManager defaultManager] currentDirectoryPath]);

//Create
NSTask *task = [[[NSTask alloc] init] autorelease];
[task setLaunchPath:toolPath];
[task setArguments:arguments];

//Run
[task launch];
[task waitUntilExit];

//Restore normal path
[[NSFileManager defaultManager] changeCurrentDirectoryPath:currentDirectory];

//Update filesystem
[[NSWorkspace sharedWorkspace] noteFileSystemChanged:archivePath];

return ([task terminationStatus] == 0);
}
再说一次,我没有断言这是防弹的(并且希望得到改进),但是它确实可以正确压缩任何单个文件夹。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-