文件不会写入磁盘。我究竟做错了啥?

Posted

技术标签:

【中文标题】文件不会写入磁盘。我究竟做错了啥?【英文标题】:File won't write to disk. What am I doing wrong?文件不会写入磁盘。我究竟做错了什么? 【发布时间】:2015-02-25 15:40:34 【问题描述】:

我正在尝试将一组对象保存到文件中。那已经失败了。因此,为了测试我的过程,我尝试将一个简单的字符串写入文件,但这也没有奏效。下面是我用来测试将字符串简单写入文件的代码。

    var directoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
    var path = directoryPath.stringByAppendingPathComponent(archivePath)
    var checkFile = NSFileManager.defaultManager()

    NSLog("Path: %@", path)

    var testString = "Hi my name is ken"
    var error : NSError?
    var written = testString.writeToFile(path, atomically: true, encoding: NSASCIIStringEncoding, error: &error)
    if ( written == false  ) 
        if ((error ) != nil) 
            var errString = error?.localizedDescription
            NSLog( "Fail: %@", errString! )
            var isDir : ObjCBool = false
            var isFile = checkFile.fileExistsAtPath(directoryPath, isDirectory: &isDir)
            if ( isDir )
                NSLog("The directory %@, exists", directoryPath )
             else 
                NSLog("The directory %@, does not exist", directoryPath )
            

        
    

这是 NSLog 语句的结果:

2015-02-25 08:37:29.280 ...应用程序名称... [14596:3911337] 路径:/Users/cs/Library/Developer/CoreSimulator/Devices/1747CFD7-5252-4221-AA89-BDEC1A57BA5A /data/Containers/Data/Application/5DC24B8F-A667-4ECD-B7E6-E139E65525E1/Documents/data/appdata.txt 2015-02-25 08:37:29.284 ...应用程序名称... [14596:3911337] 失败:操作无法完成。 (可可错误 4。) 2015-02-25 08:37:29.285 ...应用程序名称... [14596:3911337] 目录 /Users/cs/Library/Developer/CoreSimulator/Devices/1747CFD7-5252-4221-AA89-BDEC1A57BA5A/data/容器/数据/应用程序/5DC24B8F-A667-4ECD-B7E6-E139E65525E1/文档,存在

【问题讨论】:

在将内容写入文件之前,请确认该路径中不存在文件。 【参考方案1】:

您没有包含存档路径,但我认为它是 /data/appdata.txt。

文档目录存在,但其中没有 /data 文件夹,除非您创建它。尝试将文件写入 /data/appdata.txt 不会自动创建数据目录。要么首先在 .DocumentzDirectory 中创建数据目录,要么尝试将文件保存到根目录(不带 /data/)。

【讨论】:

谢谢。我会试试的。【参考方案2】:
    var directoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
        var path = directoryPath.stringByAppendingPathComponent(archivePath)
        var checkFile = NSFileManager.defaultManager()

        NSLog("Path: %@", path)

        var testString = "Hi my name is ken"
        var error : NSError?
    //1. if your archivePath is just a file name with extension
        //remove exist file first
        var canWrite : bool = true
        if (checkFile.fileExistsAtPath(path)) 
           canWrite = checkFile.removeItemAtPath(path, error:&error)
        

        if (!canWrite) 
           //show alert

           //and return
           return
        
    //2. if your archivePath is a path with some folder, besure to create if folder does not exist and continue with //1.    

        var written = testString.writeToFil

e(path, atomically: true, encoding: NSASCIIStringEncoding, error: &error)
    if ( written == false  ) 
        if ((error ) != nil) 
            var errString = error?.localizedDescription
            NSLog( "Fail: %@", errString! )
            var isDir : ObjCBool = false
            var isFile = checkFile.fileExistsAtPath(directoryPath, isDirectory: &isDir)
            if ( isDir )
                NSLog("The directory %@, exists", directoryPath )
             else 
                NSLog("The directory %@, does not exist", directoryPath )
            

        
    

【讨论】:

谢谢。当我可以回到项目中时,我会全力以赴。谢谢。【参考方案3】:

创建目录有所帮助,但事实证明,问题的关键是我写入磁盘的数组有字典,其中包含与 plist 不兼容的值。 Array.writeToFile... 写入 Plist,如果数组中的数据与 plist 不兼容,则不会写入。我最终使用 NSKeyArchiver 和 NSKeyUnArchiver 来处理写入和读取。一旦我使用它并处理了目录问题,一切都奏效了。感谢大家的建议。

【讨论】:

以上是关于文件不会写入磁盘。我究竟做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

我究竟做错了啥?我正在尝试将 selenium 依赖项添加到 Intellij,但我不断收到错误

波形写入功能不起作用,我做错了啥?

“多重定义”错误。我究竟做错了啥?

我究竟做错了啥?角垫形式场

我究竟做错了啥? NSFileManager 问题

抛出“密钥不存在”异常。我究竟做错了啥?