17

我无法对我之前的(相关)问题得到任何答复,所以我想知道稍微解释一下它是否会有所帮助。

我正在使用 NSKeyedArchiver 编码一些复杂的对象并将其保存到磁盘。说,像 -

Class member {
    int *id;
    NSString *name;
    NSMutableArray *array;
    TempClass *object;
}

我正在尝试构建的功能是让用户能够保存他的工作,比方说,同时创建一个新成员并稍后再回来。当用户完成后,他点击发布,数据将被传输到网络服务。如果没有,他只需单击保存并离开屏幕,数据就会被持久化,这样当用户回来时,应用程序就可以从那个点恢复。现在,一旦我将数据发布到 Web 服务,我不想再将数据保留在磁盘中,而且我真的找不到删除它的方法。

现在,我的编码和解码类运行良好。我可以使用 NSKeyedArchiver 将数据保存到磁盘并使用 NSKeyedUnarchiver 检索它。但是,我的问题是,如何删除不再需要的数据?我必须手动删除磁盘上的文件吗?有没有办法让 NSKeyedUnarchiver 删除它返回的数据?

谢谢,
泰加。

4

5 回答 5

23

发布数据后以编程方式将其删除的一种非常简单的方法:

- (BOOL) deleteFile:(NSString *) pathOfFileToDelete error:(NSError *)err {
    BOOL exists = [[NSFileManager defaultManager] fileExistsAtPath: pathOfFileToDelete];
    if(exists) { 
        [[NSFileManager defaultManager]removeItemAtPath: pathOfFileToDelete error:err];
    }
    return exists;
}
于 2010-07-25T11:53:23.793 回答
8

一个 Swift3 示例:

do {
 try FileManager.default.removeItem(atPath: path)
} catch {
 // catch potential error
}
于 2017-07-13T10:12:30.913 回答
5

对于 Swift 2.0:

func deleteFile(path: String) -> Bool{
    let exists = NSFileManager.defaultManager().fileExistsAtPath(path)
    if exists {
        do {
            try NSFileManager.defaultManager().removeItemAtPath(path)
        }catch let error as NSError {
            print("error: \(error.localizedDescription)")
            return false
        }
    }
    return exists
}
于 2016-03-04T13:31:13.673 回答
3

对于 Swift 3.0 -> 4.1:

let fileManager = FileManager()
let fileName = "your_file_name"

//In Order to get your file path correctly
getFileURL(_ fileName: String) -> String? {
    let fileURL = fileManager.urls(for: fileManager.SearchPathDirectory.documentDirectory, in: fileManager.SearchPathDomainMask.userDomainMask).first
    return (fileURL?.appendingPathComponent(fileName).path)
}


//Persist Data
func persistData(_ data : Data) -> Bool{
     return NSKeyedArchiver.archiveRootObject(data, toFile: getFileURL(fileName)!)
}

//Get Persisted Data
func getArchivedData() -> Data?{
    return NSKeyedUnarchiver.unarchiveObject(withFile: getFileURL(fileName)!) as? Data
}

//Delete Persisted Data 
func deleteArchivedUser() -> Bool{
    do {
        try fileManager.removeItem(atPath: getFileURL(fileName)!)
        return true
    } catch _ {
        return false
    }
}
于 2018-10-05T08:41:04.130 回答
2

对于 Swift 2.0:

do {
  try NSFileManager.defaultManager().removeItemAtPath("Your_PATH")
} catch {

}
于 2015-12-18T11:36:17.553 回答