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

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

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

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



답변

스위프트 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];


답변

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

NSFileManager 클래스 참조

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

출처 : Apple Developer API Reference

안전한 코딩 가이드에서.

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


답변

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

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;
    }
}


답변

스위프트 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)
}


답변

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

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** 
}


답변

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
}


답변

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)
    }
}