【问题标题】:Couldn't create log directory无法创建日志目录
【发布时间】:2015-07-22 22:15:48
【问题描述】:

当我在 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 ?

这是我调用数据库的代码

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

    }

}

【问题讨论】:

  • 当我使用 ALAssetsLibrary 的方法“writeImageToSavedPhotosAlbum”时,我在 Objc 中有相同的错误消息。而且我没有在我的应用程序中使用任何日志目录....
  • 嗨 patrick,你找到解决方案了吗?
  • 总是打印出error,不要只是忽略那里的变量。它通常包含相关信息。
  • 尝试把你的日志放到缓存目录(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.CachesDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as! String),这是日志唯一正确的地方。这会解决您的问题吗?切勿将任何数据写入 Documents 目录,它仅用于用户生成的内容。这也可能是应用商店拒绝您的应用的原因,因为文档内容是通过 iCloud 同步的。

标签: ios xcode swift ipad cocoa-touch


【解决方案1】:

513 是权限问题 (NSFileWriteNoPermissionError)。

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

D.

【讨论】:

  • 检查了 LogFolderPath 它将在每次运行应用程序时成功创建和更新。问题是当我在我的实际设备(Ipad)上运行它时它只打印 2015-05-12 11:25:32.478 MyApp[291:19680] [PLLogging] 无法创建日志目录:操作无法完成. (可可错误 513。)。不显示错误或警告?
  • 这个错误是出现在真实设备中、模拟器中还是两者兼而有之?如果只是在模拟器中,您是否尝试将模拟器重置为初始设置? (在模拟器菜单栏中选择“iOS模拟器”->“重置内容和设置”)
  • 是的,重启后,前 3 到 4 次构建它不会显示消息,之后它会再次显示消息
  • doh...这似乎是一个 iOS 错误...设备的固件是最新的 (8.3.1) 吗?
  • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
【解决方案2】:

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

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

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

【讨论】:

  • 我很确定他没有写入他的应用程序包,尽管他的代码很难阅读。
  • 我没有在 bundle 中创建文件
【解决方案3】:

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

  • T1:文件夹? -> 没有
  • T2:文件夹? -> 没有
  • T1:创建
  • T2:WTF?这里已经有文件夹了?

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2017-03-20
      • 2014-11-09
      • 2016-09-04
      • 2021-10-08
      • 2018-02-19
      • 2019-02-05
      • 1970-01-01
      • 2011-04-06
      • 1970-01-01
      相关资源
      最近更新 更多