Как предотвратить конфликт имен файлов при сохранении UIDocument на новый URL-адрес без управления файлами

#swift #nsfilemanager #uidocument

Вопрос:

С помощью FileManager можно проверить, существует ли файл, используя FileManager метод fileExists(atPath:) при сохранении файлов в песочнице приложения.

Однако при работе напрямую с UIDocument методом сохранения save(to:for:completion) можно принять новый URL-адрес, который перезаписывает все, что могло там быть, без предупреждения, что облегчает случайную перезапись файла. На самом деле, насколько мне известно, ни один из методов UIDocument не сообщает подробных сведений о том, почему операция с документом могла завершиться неудачно.

Возможен ли этот тип проверки только с помощью FileManager или какой-либо другой платформы?

1. Определите Подкласс Документа

 class TextDocument: UIDocument {
    var text: String?
}
 

2. Получить URL-адрес каталога документов

 let documentsDirectory = FileManager.default.urls(for: .documentDirectory, 
                                                  in: .userDomainMask).first!
 

3. Создайте 2 документа и сохраните

 let doc1 = TextDocument(fileURL: documentsDirectory
                            .appendingPathComponent("File 1")
                            .appendingPathExtension("txt"))
let doc2 = TextDocument(fileURL: documentsDirectory
                            .appendingPathComponent("File 2")
                            .appendingPathExtension("txt"))

doc1.save(to: doc1.fileURL, for: .forCreating) { success in
    print(success) // prints true
}

doc2.save(to: doc2.fileURL, for: .forCreating) { success in
    print(success) // prints true
}
 

4. Проблема: Сохранение doc1 в URL-адрес doc2 перезаписывает doc2 без предупреждения.

 doc1.save(to: doc2.fileURL, for: .forOverwriting) { success in
    print(success) // prints true
}
 

Комментарии:

1. Вы используете FileManager . Почему ты не хочешь использовать fileExists(atPath:) ?

2. Документация Apple рекомендует этого не делать. Также я пытаюсь учиться. iOS FileIO, похоже, имеет разбросанные функции, и я пытаюсь понять, какие зависимости мне могут понадобиться, и поведение каждой из них. Например, в Data приложении есть write(to:options) встроенная опция для предотвращения перезаписи файлов, но эта опция, похоже, отсутствует UIDocument .