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


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

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

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

5 202

5 ответов:

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)

Цель-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;
    }
}

проверьте, если файл существует в стороне документа / 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** 
}

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