Swift 4.0 - невозможно создать пустой текстовый файл в iOS - PullRequest
0 голосов
/ 24 сентября 2018

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

Невозможно сохранить данные: Ошибка Domain = NSCocoaErrorDomain Code = 4 "Файл« CrashLog.txt »не существует."

UserInfo = {NSFilePath = file: /// Users / ABC / Library / Developer/ CoreSimulator / Устройства / 87317777-63E7-422B-A55F-878E3267AFB8 / данные / контейнеры / данные / приложение / 4B41AA87-E4B9-4EE4-A67F-AC3B018913CC / Documents / CrashLog, NSUnderlyingError = 0x600E2ROS = код ошибки 0x600000244такой файл или каталог "}}

Код в разработке -

let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
if (paths.count > 0) {
    let documentsDirectory = paths[0]
    let logFilePath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("CrashLog.txt").absoluteString
    let _string = "Hello"
    //Create file at given path
    let data = _string.data(using: .utf8)
    //let attributes = FileManager.default.attributesOfItem(atPath: logFilePath)
    let fileExists : Bool = FileManager.default.fileExists(atPath: logFilePath)
    print(fileExists)
    let isFileCreated =  FileManager.default.createFile(atPath: logFilePath, contents: data, attributes: nil)
    print("ifFileCreated", isFileCreated)
}

Ответы [ 3 ]

0 голосов
/ 24 сентября 2018

API absoluteString неверен.Правильный API-интерфейс path

absoluteString возвращает полное представление строки URL, включая схему file://.С другой стороны, API path из FileManager ожидает пути к файловой системе, строка без схемы.

Вам все равно рекомендуется использовать API, связанный с URL, и вы можете написатьData напрямую на диск без явного создания файла.

let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let logFileURL = documentsURL.appendingPathComponent("CrashLog.txt")
let string = "Hello"

let data = Data(string.utf8)

let fileExists = FileManager.default.fileExists(atPath: logFileURL.path)
print(fileExists)
do {
    try data.write(to: logFileURL)
    print("data written")
} catch { print(error) }
0 голосов
/ 24 сентября 2018

Вот мое мнение о том, что вы сделали.Принять средства работы с файлами на основе URL.Лучший способ записать данные (по крайней мере, для этого примера) - это использовать способность Data (не FileManager) снова записывать в файл, используя URL-адрес.В большинстве случаев вам не нужно беспокоиться о том, существует файл или нет;просто сделайте это и обработайте любую возникающую ошибку.

    if var url = try? FileManager.default.url(for: .documentDirectory,
                                              in: .userDomainMask,
                                              appropriateFor: nil,
                                              create: false) {
        url = url.appendingPathComponent("CrashLog").appendingPathExtension("txt")
        let _string = "Hello"
        if let data = _string.data(using: .utf8) {
            do {
                try data.write(to: url)
                print("successful")
            } catch {
                print("unsuccessful")
            }
        }
    }
0 голосов
/ 24 сентября 2018

Метод appendingPathComponent, если получатель (например, параметр) не заканчивается завершающей косой чертой, он может прочитать метаданные файла, чтобы определить, является ли результирующий путь каталогом.Это означает, что это может привести к ошибке, которую вы видите, поэтому лучше использовать appendingPathComponent (_: isDirectory :) вместо этого.

Например:

let logFilePath = URL(fileURLWithPath: documentsDirectory).appendingPathComponent("CrashLog.txt", isDirectory: false).absoluteString
...