2012-08-28 4 views
4

코코아에서 두 파일이 같은지 (데이터가 같은지) 어떻게 효율적으로 검사합니까?코코아에서 두 파일이 같은지 확인하십시오.

컨텍스트 : 파일을 입력 (입력 파일)로 받아서 디렉토리에 복사하는 프로그램을 작성하고 있습니다. 디렉토리에 이미 동일한 이름의 파일 (이름 지정 파일)이 들어있는 경우, 이름 지정 파일이 다른 경우에만 입력 파일을 새 이름으로 복사해야합니다.

답변

5

-[NSFileManager contentsEqualAtPath:andPath:]을 사용할 수 있습니다. 워드 프로세서

: 경로 1과 경로 2가 디렉토리 인 경우

, 내용은 각 하위 디렉토리 포함 - 내용도 ​​비교 파일 및 하위 디렉토리 목록입니다. 파일의 경우이 메서드는 파일이 동일한 지 확인한 다음 크기를 비교하고 마지막으로 내용을 비교합니다. 이 방법은 심볼릭 링크를 가로 지르지 않고 링크 자체를 비교합니다.

+0

감사합니다. 'NSFileWrapper'에 해당하는'contentsEqualAtPath :'가 있는지 알고 있습니까? – hpique

+0

@hpique 오신 것을 환영합니다. 아무도 내가 아는 한 - 당신이 기억하거나 소스 파일 래퍼 (파일, 디렉토리)에서 초기화 URL을/URL을 재구성해야합니다. 'NSFileWrapper '는 파일 시스템상의 물리적 위치를 미러링 할 필요가 없다 (명백한 경우 : 메모리에있을 수있다). 그래서 디스크상의 위치를 ​​기억하는 방법을 찾아 내십시오. '네임 파일'의 내용이 이미로드 된 경우 (예 : NSFileWrapper로), 파일이 캐시에 남아 있기 때문에 예상보다 빨리 처리 할 수 ​​있습니다. 물론, 자신을 쓰는 것이 어렵지 않을 것입니다. – justin

+0

하지만 URL을 먼저 추적 한 다음'- [NSFileManager contentsEqualAtPath : andPath :]'를 사용하여 비교해보십시오. 이는 많은 애플리케이션에 적합합니다. – justin

2

내 질문에 저스틴이 대답했지만 내부적으로는 NSFileWrapper을 사용하고 있었기 때문에 항상 contentsEqualAtPath:andPath:을 사용할 수는 없었습니다.

이 사람을 도움이 경우

가, 여기에 내가 파일의 내용에 NSFileWrapper의 내용을 비교하기 위해 쓴 내용은 다음과 같습니다 저스틴 나는 '경우, 난 단지 위의 방법을 사용하고 제안으로

- (BOOL) contentsOfFileWrapper:(NSFileWrapper*)fileWrapper equalContentsAtPath:(NSString*)path {   
    NSDictionary *fileAttrs = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil]; 
    NSUInteger fileSize = [attrs fileSize]; 
    NSUInteger fileWrapperSize = [fileWrapper.fileAttributes fileSize]; // Will return zero if the file wrapper hasn't been written 
    if (fileWrapperSize > 0 && fileSize != fileWrapperSize) return NO; 

    NSData *fileData = [NSData dataWithContentsOfURL:fileURL]; 
    NSData *fileWrapperData = fileWrapper.regularFileContents; 
    return [fileData isEqualToData:resourceData]; 
} 

m 파일 랩퍼의 경로를 재구성 할 수 없습니다. 가능한 경우 contentsEqualAtPath:andPath:을 사용합니다.