2011-06-15 3 views
1

나는 내 응용 프로그램 내에서 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]; 

우편에 대한 문서가 진실 말하고 있었다 희망에 기본적으로

을, 지퍼

,691 (현재 디렉토리에 기준)의 전체 경로를 저장합니다

그러나 예상대로 작동하지 않았습니다. -j 및 -p 및 -r의 설정을 조정하면 위에서 언급 한 문제가 여러 가지 조합으로 생성됩니다.

질문 : 내가 좋아하는 디렉토리의 집합을 어떻게

  • /일부/긴/경로/SUB2/파일 1 /some/long/path/sub1/file1.txt 이 .txt

과는 내용이있는 지퍼로 지퍼

    우편의 미묘한에 어떤 조언을3210

/sub2/file1.txt

  • /sub1/file1.txt 감사합니다.

    ----- 편집

    하나 내가 추가하는 것을 잊었다 다른 것은이 전달되는 원래의 디렉토리 "경로", 그래서 원하는 결과가 내 마음도 예상 결과 것입니다. 대신 이전 작업을 실행에

    [[NSFileManager defaultManager] changeCurrentDirectoryPath:path]; 
    

    사용 -[NSTask setCurrentDirectoryPath:]

    답변

    2

    이 보편적 인 솔루션이 아니라 여러 디렉토리를 처리하지 않습니다 점에서, 아니지만, 알 수없는 내용 (단일 디렉토리를 사용하고 솔루션 즉, 혼합 파일/폴더/예를 들면 다음과 같습니다 번들)은 단순히 디렉토리 전체를 한 번에 압축하지 않고 디렉토리 내용을 열거하고 개별적으로 인수로 추가하는 것입니다.특히

    :

    + (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); 
    } 
    

    는 다시, 나는 이것이 방탄 아무런 주장을하지 않습니다 (및 개선을 사랑하는 것입니다)하지만 작업에서 제대로 단일 폴더를 압축하는 않습니다.

    2

    .

    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]; 
    … 
    
    +0

    이것은 훌륭한 솔루션처럼 보입니다. 감사합니다. 어떻게 작업 별 디렉토리 방법을 놓쳤는 지 모르겠습니다. 나는 내가 다른 길을 발견 할 수 있었기 때문에 이것을 시험하지 않았다. 내가 이것에 관해 가지고있는 또 다른 질문은, 그리고 내가 제공하는 해결책에 관한 것입니다. 두 디렉토리가 공통의 부모를 가지지 않는다면 어떨까요? – SG1

    +0

    @ SG1 디렉토리에 공통의 부모가없는 경우'zip' 명령 행 유틸리티가 그렇게 할 수 있다고 생각하지 않습니다. 이상적인 것은 아니지만 디렉토리를 일부 디렉토리에 복사 할 수 있습니다. –