2012-06-13 5 views
0

아래의 코드는 NSTask를 사용하여 디렉토리/시간 스탬프가있는 파일 하나를 만지기 만하면됩니다 (아래). 그것은 항상 잘 하나의 디렉토리에 액세스하는 애플 리케이션에서 작동하지만, 그것은 자주 그것의 데이터 중 일부에 액세스하기 위해 디렉토리를 변경하는 다른 않습니다. 내가 현재 파일과 현재 경로를 확인할 때 그들은 모두 올바른 경로를 보여줍니다. 나는 내가 생각할 수있는 모든 가능성을 만료했다. 어떤 도움이라도 대단히 감사 할 것입니다 - 감사합니다.Objective-C, NSTask가 파일을 건드릴 수 없습니다.

- (void)someMethod:(NSString *)currentfile { 

    NSFileManager *filemanager = [[NSFileManager alloc] init]; 

    if ([filemanager changeCurrentDirectoryPath: @"/"] == NO) 
    NSLog (@"Cannot change directory.\n"); 

    NSString *currentpath = [filemanager currentDirectoryPath]; 
    NSLog (@"Current directory is %@", currentpath); 

    [filemanager release]; 

    NSArray*arguments = [NSArray arrayWithObjects:@"-r",currentpath,currentfile,nil]; 

    [self touchFiles:arguments]; 

    return; 
} 

- (void)touchFiles:(NSArray *)arguments { 

    NSTask *task = [[NSTask alloc] init]; 

    [task setLaunchPath:@"/usr/bin/touch"]; 

    [task setArguments:arguments]; 

    [task launch]; 

    [task release]; 

    return; 
} 
+0

현재 디렉터리는 스레드 단위가 아니라 프로세스 단위임을 유의하십시오. 따라서 동시 스레드가있는 경우 현재 디렉터리를 변경하고 가져 오는 것이 경쟁적으로 이루어지지 않을 수 있습니다. –

+0

@MattiasWadman, 내가 시도한 모든 것이 같은 결과로 끝나기 때문에 그것이 경쟁 조건이라고 생각합니다. 어떻게 그러한 것들을 효과적으로 처리 할 수 ​​있습니까? –

+0

이 코드가 실제 코드입니까? 디렉토리를 항상 "/"(루트)로 변경합니까? /와 파일을 모두주고 싶어하는 이유는 무엇입니까? 만약 당신이 오직 디렉토리 경로 등 내가'NSString' 경로 메서드를 사용해야한다고 생각 변경 dir 물건을 사용합니다. 그렇지 않다면'@synchronize'와 같은 잠금 메커니즘을 사용하여 코드를 원자 적으로 만들 수 있습니다. –

답변

1

NSTask을 사용하지 않고 파일의 수정 시간을 변경할 수 있습니다. 키 NSURLContentModificationDateKey-[NSURL setResourceValue:forKey:error:]을 사용하십시오.

NSTasktouch의 사용이 실패한 이유는 파일 수정 시간을 수정할 수있는 권한이없는 것일 수 있습니다. 콘솔 로그를보고 touch에서 오류가보고되었는지 또는 작업의 표준 오류 출력을 다른 곳으로 리디렉션하고 확인하십시오.

+0

출력 방향을 변경하더라도 오류가 없습니다. 나는 말하기 힘들지만 스레드와 동기화되지 않는 문제라고 생각합니다. 응답 주셔서 감사합니다, 나는 당신의 제안을 살펴 보겠습니다. 나도 똑같은 결과로 NSFileManager를 시도했다. : -/ –

+0

어떤 스레드가 있습니까? 이것이 멀티 스레드 문제라고 상상할 이유는 없습니다. –

+0

잘 모르겠습니다. 누군가 다른 코멘트에서 언급했다. 그 밖의 무엇이있을 수 있 었는가? –