NSFileWrapper的serializedRepresentation返回不适当的大数据

时间:2016-03-09 02:39:21

标签: objective-c swift macos cocoa foundation

NSFileWrapper' s serializedRepresentation在Cocoa框架而不是仅导入Foundation框架时返回不适当的大数据。如何阻止serializedRepresentation返回这些庞大的数据。

我的情景:

我使用软件包(即文件夹)在OS X上存储应用程序的数据。

与导入基金会时相比,当导入Cocoa时,serializedRepresentation返回的数据要大几个数量级。

将这些文件转换回包时,生成的包似乎完全相同。

这个实际的示例包是22KB:

folder: [
    some.plist,
    folder: [
        1.png
    ]
]

导入Cocoa框架后,根据serializedRepresentation返回的数据创建的文件为3.2MB

仅导入Foundation时,由serializedRepresentation返回的数据创建的文件为32KB

1 个答案:

答案 0 :(得分:0)

TL; DR:

删除NSFileWrapper的Cocoa实现添加的所有图标。

说明和示例:

可可框架在返回serializedRepresentation之前,向文件中添加了某种图标。这会使生成的文件非常大。

要解决此问题:请从每个文件中手动删除图标。

快速示例:

func removeIconsFromFileWrapper(wrapper: NSFileWrapper) {
    wrapper.icon = nil
    if wrapper.directory {
        for directory in wrapper.fileWrappers!.values {
            removeIconsFromFileWrapper(directory)
        }
    }
}

let thisFileURL = NSURL(fileURLWithPath: filePath)
if let fileWrapper = try?NSFileWrapper(URL: thisFileURL, options: NSFileWrapperReadingOptions.Immediate) {
    removeIconsFromFileWrapper(fileWrapper)
    let fileData = fileWrapper.serializedRepresentation
    let newFileURL = thisFileURL.URLByAppendingPathExtension("extension")
    do {
        try fileData?.writeToURL(newFileURL, options: NSDataWritingOptions.AtomicWrite)
        success = true
    } catch {
        // !!!: inform user that:
        NSLog("the file \(newFileURL) could not be saved")
    }
} else {
    NSLog("the file could not be read")
}