Подтвердить что ты не робот

Не удалось создать каталог журнала

Когда я тестирую свое приложение на iPad, он работает отлично, то есть вызовите базу данных, создайте папку и выполните другую задачу, но в консоли она покажет мне

2015-05-12 11: 25: 32.478 MyApp [291:19680] [PLLogging] Не удалось создать каталог журналов: операция не может быть завершена. (Cocoa ошибка 513.).

Когда я ищу, нашел этот ответ NSFileManager, создающий папку (Cocoa ошибка 513.)

Но не abel, чтобы удалить это.
Также, когда я выключаю и перезапускаю iPad, эта строка не отображается

Вопрос:

  • Почему я получаю это выражение в консоли?
  • Вышеуказанное утверждение может привести к сбою моего приложения в будущем?
  • Как удалить Cocoa ошибку 513?

Вот мой код для вызова базы данных

let fileManager = NSFileManager()
var Sourcepath = NSBundle.mainBundle().resourcePath?.stringByAppendingPathComponent("DataBase.db");
let docsPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as! String
let databaseStr = "DataBase.db"
let dbPath = docsPath.stringByAppendingPathComponent(databaseStr)
println(dbPath)    
if(fileManager .fileExistsAtPath(dbPath) == false) {

    var error:NSError?
    fileManager.copyItemAtPath(Sourcepath!, toPath: dbPath, error: &error)
    println(error)
}

и вот функции, которые создают папку журналов

func CreateLog(Log:String)
{
    autoreleasepool{

        var formatter:NSDateFormatter! = NSDateFormatter()
        formatter.dateFormat = "yyyy-MM-dd";
        var DateString = formatter.stringFromDate(NSDate()).stringByAppendingString("_tempLogs")
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss";
        var FileManager:NSFileManager! = NSFileManager.defaultManager()

        var LogFolder = NSBundle.mainBundle().resourcePath?.stringByAppendingPathComponent("Logs")
        let searchPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as! String
        let LogStr = "Logs"
        let LogFolderPath = searchPath.stringByAppendingPathComponent(LogStr)

        if(FileManager.fileExistsAtPath(LogFolderPath) == false)
        {
            var error:NSError?
            FileManager.createDirectoryAtPath(LogFolderPath, withIntermediateDirectories: true, attributes: nil, error: &error)

        }
        var LogPath = LogFolderPath.stringByAppendingPathComponent(DateString).stringByAppendingPathExtension("txt")
        var WriteString = (formatter.stringFromDate(NSDate()).stringByAppendingString(" ").stringByAppendingString(Log).stringByAppendingString("\n"));
        var Data = WriteString.dataUsingEncoding(NSUTF8StringEncoding)
        if(!FileManager.fileExistsAtPath(LogPath!))
        {
            FileManager.createFileAtPath(LogPath!, contents: Data, attributes: nil)
        }
        else
        {
            var output = NSFileHandle(forWritingAtPath: LogPath!);
            output?.seekToEndOfFile();
            output?.writeData(Data!);
            output?.closeFile()
            output = nil
        }
        formatter = nil
        FileManager = nil

    }

}
4b9b3361

Ответ 1

513 - проблема разрешения (NSFileWriteNoPermissionError).

Попробуйте распечатать LogFolderPath и дважды проверьте правильность (или опубликуйте здесь результат).

Д.

Ответ 2

Проблема заключается в том, что вы пытаетесь создать файл в своем приложении. Пакет доступен только для чтения в iOS (и вы должны рассматривать его как "только для чтения" на Mac OS, даже если его можно записать в комплект вашего приложения в Mac OS.)

Ваш код будет работать на симуляторе, потому что изменение версии приложения разрешено в Mac OS, а симулятор работает под Mac OS.

Измените свой код, чтобы использовать каталог ваших документов, каталог temp или какой-либо другой каталог в вашем комплекте, и все должно быть в порядке.

Ответ 3

Я думал об этом сценарии, и я не могу придумать лучшего предложения, чем: Race Condition? Может ли быть, что два шага пытаются войти в одно и то же время? Первый создает папку непосредственно после того, как второй протектор проходит проверку .fileExistsAtPath?

  • T1: папка? → Нет
  • T2: папка? → Нет
  • T1: Создать
  • T2: WTF? Здесь уже есть папка?

Если это так, это может решить проблему, перемещая проверку каталога и логику на более ранний этап, например, при запуске приложения или аналогичном.

Не уверен, что это проблема, или что это определенный ответ, так что просто позвоните в это квалифицированное предположение...:)

Ответ 4

Формат, который вы используете для получения строки даты, - "yyyy-MM-dd HH: mm: ss", который вводит пробел в результирующей строке. Удалите пространство в форматировании, чтобы оно выглядело так: "yyyy-MM-ddHH: mm: ss" и попробуйте приведенный выше код, или вы можете заменить пространство в результирующем пути и записать данные в файл