如何解决从命令行压缩-如何修剪路径元素
| 我正在使用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 举报,一经查实,本站将立刻删除。