Как проверить, существует ли файл в папке "Документы"?

У меня есть приложение с In-App Purchase, которое, когда пользователь что-то покупает, загружает один html файл в папку "Документы" моего приложения.

Теперь я должен проверить, существует ли этот HTML файл, поэтому, если true, загрузите этот HTML файл, а затем загрузите мою страницу html по умолчанию.

Как я могу это сделать? С NSFileManager я не могу выйти за пределы mainBundle..

Ответ 1

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

Objective-C:

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

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

Ответ 2

Apple рекомендует не полагаться на метод fileExistAtPath:. Часто лучше просто попытаться открыть файл и обработать ошибку, если файл не существует.

Справочник по классам NSFileManager

Примечание. Попытка предикатного поведения, основанного на текущем состоянии файловой системы или конкретного файла в файловой системе, не рекомендуется. Это может привести к нечетному поведению или условиям гонки. Намного лучше попытаться выполнить операцию (например, загрузить файл или создать каталог), проверить ошибки и обработать эти ошибки изящно, чем пытаться выяснить заранее, удастся ли выполнить операцию. Дополнительные сведения о состоянии гонки файловой системы см. В разделе "Условия гонки и безопасные операции с файлами" в Руководстве по безопасному кодированию.

Источник: Справочник API разработчика Apple

Из руководства по безопасному кодированию.

Чтобы предотвратить это, программы часто проверяют, чтобы временный файл с определенным именем еще не существует в целевом каталоге. Если такой файл существует, приложение удаляет его или выбирает новое имя для временного файла, чтобы избежать конфликта. Если файл не существует, приложение открывает файл для записи, потому что системная процедура, открывающая файл для записи, автоматически создает новый файл, если он не существует. Злоумышленник, постоянно запуская программу, которая создает новый временный файл с соответствующим именем, может (с небольшой настойчивостью и некоторой удачей) создать файл в промежутке между тем, когда приложение проверено, чтобы убедиться, что временный файл не существует, и когда он открывает его для написания. Затем приложение открывает файл злоумышленника и записывает его (помните, что системная процедура открывает существующий файл, если он есть, и создает новый файл, только если нет существующего файла). Файл злоумышленников может иметь разные разрешения доступа, чем временный файл приложений, поэтому злоумышленник может читать содержимое. Кроме того, злоумышленник может открыть файл. Злоумышленник может заменить файл жесткой ссылкой или символической ссылкой на другой файл (любой из которых принадлежит злоумышленнику или существующий системный файл). Например, злоумышленник может заменить файл символической ссылкой на файл системного пароля, чтобы после атаки системные пароли были повреждены до такой степени, что никто, включая системного администратора, не может войти в систему.

Ответ 3

Если вы настроили свою файловую систему по-другому или ищете другой способ настройки файловой системы, а затем проверьте, существует ли файл в папке документов, другой пример. также показывают динамическую проверку

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

проверьте, существует ли файл в стороне пути document/catchimage:

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

Ответ 5

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