无法创建日志目录

时间:2015-05-12 07:10:55

标签: ios xcode swift ipad cocoa-touch

当我在iPad上测试我的应用程序时,它运行得很好,即调用数据库,创建文件夹并执行其他任务,但在控制台中显示我

  

2015-05-12 11:25:32.478 MyApp [291:19680] [PLLogging]无法创建日志目录:操作无法完成。 (可可错误513.)。

当我搜索时,找到了这个答案NSFileManager creating folder (Cocoa error 513.)

但不要删除这个。
此外,当我关闭并重新启动iPad时,此行未显示

问题:

  1. 为什么我在控制台中收到此声明?
  2. 以上声明可能会在将来崩溃我的应用程序?
  3. 如何删除Cocoa错误513?
  4. 这是我调用数据库的代码

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

4 个答案:

答案 0 :(得分:1)

513是权限问题(NSFileWriteNoPermissionError)。

尝试打印LogFolderPath并仔细检查它是否正确(或在此处发布结果)。

d

答案 1 :(得分:1)

问题是您正在尝试在应用的捆绑包中创建文件。该捆绑包在iOS中是只读的(您应该在Mac OS上将其视为只读,即使可以在Mac OS中写入您的应用程序包。)

您的代码可以在模拟器上运行,因为在Mac OS上允许更改应用包 ,并且模拟器在Mac OS下运行。

更改您的代码以使用您的文档目录,临时目录或捆绑包中的其他目录,您应该没问题。

答案 2 :(得分:1)

我一直在考虑这种情况,我不能提出比Race Condition更好的建议吗? 是不是两个踏板试图同时登录?第二个脚本通过.fileExistsAtPath检查后,第一个直接创建文件夹?

  • T1:文件夹? - >否
  • T2:文件夹? - >否
  • T1:创建
  • T2:WTF?这里有一个文件夹?

如果是这种情况,它可以通过将创建目录检查和逻辑移动到更早的阶段来解决问题,例如在App start或类似的阶段。

不确定这是问题还是这是明确的答案,所以让我们称之为合格的猜测...... :)

答案 3 :(得分:1)

用于获取日期字符串的格式为" yyyy-MM-dd HH:mm:ss"它在结果字符串中引入了一个空格。删除格式化程序中的空格,使其看起来像这样" yyyy-MM-ddHH:mm:ss"并尝试上面的代码,或者您可以替换生成的路径中的空格并将数据写入文件