ProgramingTip

NSURL을 사용하여 파일 존재 테스트

bestdevel 2020. 10. 31. 09:56
반응형

NSURL을 사용하여 파일 존재 테스트


Snow Leopard는 NSURL 개체를 사용하여 경로 이름이나 Core Services의 FSRef가 아닌 파일을 참조하는 여러 가지 새로운 방법을 도입했습니다.

그러나 URL 기반 방법을 수없는 한 가지 작업이 있습니다. 파일 존재 여부 테스트. -[NSFileManager fileExistsAtPath:] 의 URL 기반 버전을 찾고 있습니다. 이 메소드와 목적지 YESURL이 일반 파일, 디렉토리 또는 기타 어떤 것을 설명하는 경우 반환 해야합니다.

다양한 리소스 값 을 찾아 볼 수있는 것은 명시 적으로 보장되는 비용이 많이들 수 있습니다. (예 : NSURLffectiveIconKey )는 비용이 많이들 수 있습니다.

NSFileManager를 사용할 수 fileExistsAtPath:있도록 더 현대적인 방법이 사용하는 것을 선호합니다.

주어진 파일 (또는 파일 참조) URL이 존재하는 파일 시스템을 참조하는지 여부를 알려주는 보장 / 문서화 Cocoa, CF 또는 핵심 서비스에 간단한 방법이나 기능이 있습니까?


NSURL에는 다음 방법이 있습니다.

- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error

"파일 URL이 제공하는 리소스에 도달 할 수 있는지 여부를 반환합니다."

NSURL *theURL = [NSURL fileURLWithPath:@"/Users/elisevanlooij/nonexistingfile.php" 
               isDirectory:NO];
NSError *err;
if ([theURL checkResourceIsReachableAndReturnError:&err] == NO)
    [[NSAlert alertWithError:err] runModal];

iOS에서는 다른 방법을 사용할 수 없습니다 ...

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"file.type"];
if ([[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {...}

다음은 스위프트 2 답변입니다.

var error:NSError?
let folderExists = theURL.checkResourceIsReachableAndReturnError(&error)

주어진 전용 (또는 없음 파일 참조) URL이 존재하는 파일 시스템을 참조하는지 확인하는 것이 파일 시스템 원격 리소스에 비용이 많이 들었습니다. 모두 동기식입니다. , 당신이 사용하는 많은 파일에 여전히 상당한 지연 오버 헤드를 사용할 것입니다.

해야 할 일은 유효한 리소스 목록을 생성하는 캐싱을 사용하여 자체 생성하는 검사 루틴을 구현하는 것입니다.

명명 된 헤더 상태의 CFURLResourceIsReachable에 대한 참고 사항 :

예를 들어 특정 문서의 존재 여부에 따라 UI 상태를 주기적으로 유지 관리하는 것입니다. 파일을 수행 할 때 먼저 연결 가능성을 확인하는 것보다 작업을 시도하고 실패를 처리하는 것이 더 먼저입니다.


NSURL은 더 많은 로컬 파일 시스템을 가지고 있기 때문에 수있는 방식이 있습니다. 코코아 재단에는 기능이 없습니다.

로컬 파일 시스템 만 다루는 경우 메시지 와 함께 NSURL또는에 대한 범주를 만드는 것이 좋습니다 . 그것은 변환 할 A와 인보 다음 (정규화 경로)와 메시지입니다.NSFileManagerurlExists:NSURLNSString[NSFileManager fileExistsAtPath:]


Swift에서는 checkResourceIsReachable()메소드 를 사용할 수 있지만, 불행히도 true(파일에 도달 할 수있는 경우) 반환 오류를 발생 수정 (도달 할 수없는 이유를 설명)합니다.

대신 bool true / false 값을 얻으려면 다음 구문을 사용하십시오.

let exists = (try? inputFile.checkResourceIsReachable()) ?? false

오류를 기록 :

let exists: Bool
do {
  exists = try inputFile.checkResourceIsReachable()
} catch {
  exists = false
  print(error.localizedDescription)
}

(다른 프로세스가 디스크 파일이 확인하는 동안 디스크를 삭제 마운트 해제하는 경우)

일반적으로 선호되는 접근 방식은 파일의 존재 여부를 확인하는 것이 아니라 파일을 읽거나 쓰려고 시도 실패 할 경우 나중에 오류를 처리하는 것입니다.

참고 URL : https://stackoverflow.com/questions/1927754/testing-file-existence-using-nsurl

반응형