문서 폴더에 파일이 있는지 확인하는 방법은 무엇입니까?


216

사용자가 무언가를 구입할 때 하나의 html 파일을 내 앱의 문서 폴더에 다운로드하는 인앱 구매 응용 프로그램이 있습니다.

이제이 HTML 파일이 있는지 확인해야하므로 true이면이 HTML 파일을로드하고 그렇지 않으면 기본 HTML 페이지를로드하십시오.

내가 어떻게 할 수 있습니까? 와 함께 NSFileManager나올 수 없습니다 mainBundle..


"NSFileManager를 사용하면 mainBundle 외부로 갈 수 없습니다"-이 잘못된 정보는 어디서 얻었습니까?

답변:


521

스위프트 3 :

let documentsURL = try! FileManager().url(for: .documentDirectory,
                                          in: .userDomainMask,
                                          appropriateFor: nil,
                                          create: true)

...는 문서 디렉토리의 파일 URL을 제공합니다. 다음은 foo.html이라는 파일이 있는지 확인합니다.

let fooURL = documentsURL.appendingPathComponent("foo.html")
let fileExists = FileManager().fileExists(atPath: fooURL.path)

목표 -C :

NSString* documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

NSString* foofile = [documentsPath stringByAppendingPathComponent:@"foo.html"];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:foofile];

12
탈옥 된 경우 찾을 수있는 전역 디렉토리가 아니라 응용 프로그램의 개인 문서 디렉토리에서 파일을로드하고 있습니다. 주 응용 프로그램 인 것처럼 / 응용 프로그램에 응용 프로그램을 설치하면 전체 파일 시스템에 액세스 할 수 있으며 공유 문서 디렉토리를 사용하게됩니다. iTunes 또는 XCode를 통해 설치하면 응용 프로그램의 개인 디렉토리를 사용하게됩니다. 백업 목적으로 로컬 디렉토리에 파일을 저장하는 것이 좋습니다.
Epsilon Prime

6
objectAtIndex : 0 지금 firstObject로 대체 할 수있다
고 빈드

3
또는 [0]인덱스 액세스를 통해
temporary_user_name 0시

firstObject는 [0]보다 안전하며 objectAtIndex : 0
Itachi

1
@Itachi 실제로이 경우 배열에 객체가 없을 때 예외를 선호합니다. 의 결과는 경우 firstObject입니다 nil애플 프레임 워크에 뭔가가 심각하게 고장으로 프로그램을 계속 수있는 방법을 합리적인 방법이 더있다.
Nikolai Ruhe 2016 년

14

Apple은 fileExistAtPath : 메소드에 의존하지 않는 것이 좋습니다. 파일을 열려고 시도하고 파일이 존재하지 않는 경우 오류를 처리하는 것이 좋습니다.

NSFileManager 클래스 참조

참고 : 파일 시스템의 현재 상태 또는 파일 시스템의 특정 파일을 기반으로 동작을 선언하려고 시도하지 않는 것이 좋습니다. 그렇게하면 이상한 행동이나 경쟁 조건이 발생할 수 있습니다. 파일을로드하거나 디렉토리를 만드는 등의 작업을 시도하고 오류를 확인한 후 작업의 성공 여부를 미리 파악하는 것보다 오류를 정상적으로 처리하는 것이 훨씬 좋습니다. 파일 시스템 경쟁 조건에 대한 자세한 내용은 보안 코딩 안내서의 "경쟁 조건 및 보안 파일 작업"을 참조하십시오.

출처 : Apple Developer API Reference

안전한 코딩 가이드에서.

이를 방지하기 위해 프로그램은 종종 특정 이름의 임시 파일이 대상 디렉토리에 존재하지 않는지 확인합니다. 이러한 파일이 존재하면 응용 프로그램은 파일을 삭제하거나 충돌을 피하기 위해 임시 파일의 새 이름을 선택합니다. 파일이 존재하지 않으면, 쓰기 위해 파일을 여는 시스템 루틴이 존재하지 않으면 자동으로 새 파일을 작성하므로 응용 프로그램은 쓰기 위해 파일을 엽니 다. 적절한 이름으로 새 임시 파일을 만드는 프로그램을 지속적으로 실행하는 공격자는 응용 프로그램에서 임시 파일이 존재하지 않는지 확인한 시점 사이에 간격을두고 파일을 만들 수 있습니다. 그리고 쓰기 위해 열 때. 그런 다음 응용 프로그램은 공격자의 파일을 열고 파일에 기록합니다 (시스템 루틴은 기존 파일이있는 경우 기존 파일이없는 경우에만 새 파일을 만듭니다. 침입자의 파일은 응용 프로그램의 임시 파일과 다른 액세스 권한을 가질 수 있으므로 공격자는 내용을 읽을 수 있습니다. 또는 공격자가 파일을 이미 열었을 수도 있습니다. 침입자는 파일을 다른 파일 (공격자가 소유 한 파일 또는 기존 시스템 파일)에 대한 하드 링크 또는 심볼릭 링크로 바꿀 수 있습니다. 예를 들어 공격자는 파일을 시스템 암호 파일에 대한 심볼릭 링크로 교체하여 공격 후 시스템 관리자를 포함하여 아무도 로그인 할 수 없을 정도로 시스템 암호가 손상 될 수 있습니다. 또는 공격자가 파일을 이미 열었을 수도 있습니다. 침입자는 파일을 다른 파일 (공격자가 소유 한 파일 또는 기존 시스템 파일)에 대한 하드 링크 또는 심볼릭 링크로 바꿀 수 있습니다. 예를 들어 공격자는 파일을 시스템 암호 파일에 대한 심볼릭 링크로 교체하여 공격 후 시스템 관리자를 포함하여 아무도 로그인 할 수 없을 정도로 시스템 암호가 손상 될 수 있습니다. 또는 공격자가 파일을 이미 열었을 수도 있습니다. 침입자는 파일을 다른 파일 (공격자가 소유 한 파일 또는 기존 시스템 파일)에 대한 하드 링크 또는 심볼릭 링크로 바꿀 수 있습니다. 예를 들어 공격자는 파일을 시스템 암호 파일에 대한 심볼릭 링크로 교체하여 공격 후 시스템 관리자를 포함하여 아무도 로그인 할 수 없을 정도로 시스템 암호가 손상 될 수 있습니다.


1
이것은 좋은 답변이지만 훌륭한 조언을 제공합니다. 이것이 작은 코드 예제로 어떻게 구현 될 수 있는지 보는 것이 좋습니다.
SnareChops 2018 년

8

파일 시스템을 다르게 설정하거나 파일 시스템을 설정하는 다른 방법을 찾은 다음 문서 폴더에 파일이 있는지 확인하는 또 다른 예가 여기 있습니다. 동적 확인 표시

for (int i = 0; i < numberHere; ++i){
    NSFileManager* fileMgr = [NSFileManager defaultManager];
    NSString *documentsDirectory = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    NSString* imageName = [NSString stringWithFormat:@"image-%@.png", i];
    NSString* currentFile = [documentsDirectory stringByAppendingPathComponent:imageName];
    BOOL fileExists = [fileMgr fileExistsAtPath:currentFile];
    if (fileExists == NO){
        cout << "DOESNT Exist!" << endl;
    } else {
        cout << "DOES Exist!" << endl;
    }
}

4

스위프트 2.0

Swift를 사용하여 파일이 존재하는지 확인하는 방법입니다

func isFileExistsInDirectory() -> Bool {
    let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
    let documentsDirectory: AnyObject = paths[0]
    let dataPath = documentsDirectory.stringByAppendingPathComponent("/YourFileName")

    return NSFileManager.defaultManager().fileExistsAtPath(dataPath)
}

3

파일이 문서 / 캐치 이미지 경로에 있는지 확인하십시오.

NSString *stringPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSString *tempName = [NSString stringWithFormat:@"%@/catchimage/%@.png",stringPath,@"file name"];
NSLog(@"%@",temName);
if([[NSFileManager defaultManager] fileExistsAtPath:temName]){
    // ur code here
} else {
    // ur code here** 
}

0
NSArray *directoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString *imagePath =  [directoryPath objectAtIndex:0];
//If you have superate folder
imagePath= [imagePath stringByAppendingPathComponent:@"ImagesFolder"];//Get docs dir path with folder name
_imageName = [_imageName stringByAppendingString:@".jpg"];//Assign image name
imagePath= [imagePath stringByAppendingPathComponent:_imageName];
NSLog(@"%@", imagePath);

//Method 1:
BOOL file = [[NSFileManager defaultManager] fileExistsAtPath: imagePath];
if (file == NO){
    NSLog("File not exist");
} else {
    NSLog("File exist");
}

//Method 2:
NSData *data = [NSData dataWithContentsOfFile:imagePath];
UIImage *image = [UIImage imageWithData:data];
if (!(image == nil)) {//Check image exist or not
    cell.photoImageView.image = image;//Display image
}

0

NSURL.h 제공 - (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error이렇게

NSURL *fileURL = [NSURL fileURLWithPath:NSHomeDirectory()];
NSError * __autoreleasing error = nil;
if ([fileURL checkResourceIsReachableAndReturnError:&error]) {
    NSLog(@"%@ exists", fileURL);
} else {
    NSLog(@"%@ existence checking error: %@", fileURL, error);
}

또는 스위프트를 사용하여

if let url = URL(fileURLWithPath: NSHomeDirectory()) {
    do {
        let result = try url.checkResourceIsReachable()
    } catch {
        print(error)
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.