programing

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

padding 2023. 5. 23. 21:37
반응형

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

사용자가 물건을 살 때 HTML 파일 하나를 내 앱의 문서 폴더에 다운로드하는 앱이 있습니다.

이제 나는 이 HTML 파일이 존재하는지 확인해야 하므로, 만약 사실이라면, 이 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은 파일 ExistAtPath: 메서드를 사용하지 않는 것이 좋습니다.파일이 없는 경우 파일을 열고 오류를 처리하는 것이 좋습니다.

NSFileManager 클래스 참조

참고: 파일 시스템의 현재 상태 또는 파일 시스템의 특정 파일을 기준으로 동작을 술어화하지 않는 것이 좋습니다.이렇게 하면 이상한 행동이나 인종 조건이 발생할 수 있습니다.작업이 성공할지 여부를 미리 파악하는 것보다 작업(예: 파일 로드 또는 디렉터리 만들기)을 시도하고 오류를 확인하고 이러한 오류를 우아하게 처리하는 것이 훨씬 좋습니다.파일 시스템 경합 조건에 대한 자세한 내용은 보안 코딩 안내서의 "레이스 조건 및 보안 파일 작업"을 참조하십시오.

출처: Apple 개발자 API 참조

보안 코딩 가이드에서 확인합니다.

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

파일 시스템을 다르게 설정하거나 파일 시스템을 설정하는 다른 방법을 찾고 있는 경우 다음은 문서 폴더에 파일이 있는지 확인하는 또 다른 예입니다.동적 검사 표시

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

또는 Swift 사용

if let url = URL(fileURLWithPath: NSHomeDirectory()) {
    do {
        let result = try url.checkResourceIsReachable()
    } catch {
        print(error)
    }
}

언급URL : https://stackoverflow.com/questions/1638834/how-to-check-if-a-file-exists-in-documents-folder

반응형