无法创build日志目录

当我在iPad上testing我的应用程序时,它可以完美运行,即调用数据库,创build文件夹并执行其他任务,但在控制台中显示给我

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

当我search,发现这个答案NSFileManager创build文件夹(Cocoa错误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) } 

这里是一个创build日志文件夹的function

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

513是一个权限问题(NSFileWriteNoPermissionError)。

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

D.

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

你的代码可以在模拟器上工作,因为在Mac OS上允许更改应用程序包,模拟器在Mac OS上运行。

改变你的代码来使用你的文档目录,临时目录或其他目录,你应该没问题。

我一直在想这种情况,我不能提出比以下更好的build议: Race Condition ? 难道两个步伐是同时尝试login吗? 第一个创build文件夹后,第二步是通过.fileExistsAtPath检查?

  • T1:文件夹? – >没有
  • T2:文件夹? – >没有
  • T1:创build
  • T2:跆拳道? 这里有一个文件夹?

如果是这样的话,它可以通过将创build目录检查和逻辑移动到更早的阶段来解决问题,就像在App开始或类似的。

不知道这是问题还是这是明确的答案,所以我们把它称为一个合格的猜测… 🙂

用于获取datestring的格式是“yyyy-MM-dd HH:mm:ss”,它在结果string中引入空格。 删除格式化程序中的空格,使其看起来像“yyyy-MM-ddHH:mm:ss”,然后尝试上面的代码,或者可以replace结果path中的空格并将数据写入文件