NSFileWrapper 的 serializedRepresentation returns 数据过大

NSFileWrapper's serializedRepresentation returns inappropriately large data

NSFileWrapperserializedRepresentation returns 在 Cocoa 框架而不是仅导入 Foundation 框架时数据过大。如何防止 serializedRepresentation 返回这么大的数据。

我的场景:

我正在使用包(也称为文件夹)为 OS X 上的应用程序存储数据。

与仅导入 Foundation 相比,导入 Cocoa 时 serializedRepresentation 返回的数据大几个数量级。

将这些文件转换回包时,生成的包看起来是相同的。

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

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

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

只有 Foundation 导入,根据 serializedRepresentation 返回的数据创建的文件是 32KB

长话短说:

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

解释和例子:

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

解决此问题:手动删除每个文件的图标。

Swift 示例:

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