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

| 我正在使用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);
}
再说一次,我没有断言这是防弹的(并且希望得到改进),但是它确实可以正确压缩任何单个文件夹。     

要回复问题请先登录注册