问题标签 [nsfilewrapper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
611 浏览

ios - 将 NSMutableAttributedString 写入 rtf 文件无法打开?

我尝试过的代码如下: -

编写代码attributedString

我的字符串值如下:-

并且 BOOL 类型的成功变量也显示 yes ,文件写入成功。但是当我尝试在我的文件夹位置打开 rtf 文件时,它会显示一条错误消息,如下所示:-

在此处输入图像描述

0 投票
2 回答
2640 浏览

swift - 似乎无法避免在 Swift 中强制展开

更新:这是关于在 Xcode 中使用基于文档的应用程序模板创建的 Mac 应用程序,我正在覆盖


我正在尝试从 NSFileWrapper 读取文件,似乎我无法摆脱其中至少有一个文件!

首先,我试过

所以我得到这个错误

可选类型“NSData?”的值 未拆封;你的意思是用'!' 或者 '?'?

而且我必须要么强制转换,要么必须在 NSMutableAttributedString 的初始化程序 ( )regularFileContents as NSData!中强制解包它。data: rtfData!


所以我尝试了

这导致

找不到接受类型为“(数据:NSData??,选项:[String:String],documentAttributes:nil,错误:nil)”的参数列表的“NSMutableAttributedString”类型的初始化程序

所以我必须将初始化程序更改为data: rtfData!!,我什至不确定这意味着什么。

或者,我可以强制转换regularFileContents as NSData?,然后我只能!在初始化程序中使用一个。

更新:这是我发布后尝试的另一件事。我认为双重?输入NSData??可能是由于我选择性地打开了 NSFileWrapper (files["textFile.rtf"]?)所以我尝试了这个:

编译器仍然希望我强制打开 NSData。


我非常困惑。

什么是NSData??,为什么它是“双重”可选的,为什么它是 的结果.regularFileContents,以及我怎样才能安全地,不用!-ing 一路获取 NSData 并将其传递给 NSMutableAttributedString 的初始化器?


另一个更新

我想也许这个files常量可能是另一个可选包装的来源:

但是编译器不会让我if let这样做。例如,如果我尝试,

编译器给出了这个错误:

条件绑定中的绑定值必须是可选类型

关于fileWrapper.fileWrappers

变量是方法的fileWrapper参数,即

0 投票
1 回答
311 浏览

ios - 如何避免 NSFileWrapper 在写入文件时使用大量内存

我有一个NSFileWrapper用于创建用户数据备份的应用程序。此备份文件包含文本和媒体文件(此处不涉及压缩)。有时这些备份文件会变得非常大,超过 200 MB。当我调用NSFileWrapper -writeToURL...它时,它似乎将整个内容加载到内存中作为写入过程的一部分。在较旧的设备上,这会导致我的应用程序由于内存限制而被系统终止。

有没有一种简单的方法可以避免将NSFileWrapper所有内容加载到内存中?我已经阅读了所有NSFileWrapper我能找到的问题。关于如何解决这个问题的任何建议?

这是备份文件的当前文件结构:

BackupContents.backupxyz user.txt - folder1 - audio files asdf.caf asdf2.caf - folder2 - audio files asdf3.caf

同样,请不要告诉我压缩我的音频文件。那只是对有缺陷的设计的创可贴。

似乎我可以将所有文件移动/复制到一个目录中NSFileManager,然后将该目录作为一个包。我应该走那条路吗?

0 投票
1 回答
901 浏览

macos - 使用 NSFileWrapper 保存文档

我正在开发一个基于文档的应用程序,允许用户插入图像、电影来制作作品。

保存文档时,我创建了一个 directoryFileWrapper,在其中放置了我的项目的 xml 表示,并使用原始路径(如果尚未保存文档)或它在包内的相对路径为每个图像/电影创建一个 fileWrapper。

保存后,用户可以将文档移动到另一个位置/mac,并且仍然可以访问其内容。

如果用户执行“SaveAsOperation”并将其保存在同一位置,则文档首先被删除,然后我必须重新创建它。问题是我无法使用相对路径重新创建 fileWrappers,因为文档本身已被删除。

有没有办法防止它发生?将现有文件保存到包中的正确方法是什么?

0 投票
0 回答
243 浏览

cocoa - 对没有 NSFileWrapper 的包使用 NSDocument

我想创建一个包含多个目录的包,其中包含媒体数据(音频和视频),然后将其作为 AVURLAssets 加载。
由于 AVURLAssets 是使用 URL 创建的,因此我不能使用(据我所知)NSFileWrapper。文档指出 NSFileWrapper 将文件的完整内容存储在内存中,这对于可能高达 1 GB 的视频数据来说似乎不是一个好主意。

我目前正在使用 writeToURL 和 readFromURL 来读取/写入包,但这不能按预期工作,因为 URL 是一个临时目录,如果该目录为空,则整个过程将失败(如果没有任何更改,则会发生这种情况)。

此外,当我下载音频/视频文件时,最好在完全加载后立即将其存储在包中(不仅在自动保存/保存时)。我知道我可以为此使用缓存或应用程序支持文件夹,但我不完全确定卸载应用程序时应用程序支持文件夹会发生什么(最坏的情况是用户的硬盘上有多个 GB 的不必要数据)。该文档指出应用程序不应依赖缓存目录中的文件,但我需要磁盘上某处的媒体文件以进行快速/离线访问。

处理这种情况的正确方法是什么?

0 投票
1 回答
615 浏览

ios - 将 [NSFileWrapper initDirectoryWithFileWrappers] 转换为 Swift

我有以下 Objective-C 代码:

我试图将上面的代码转换为 Swift:

最后一行无法编译。我收到错误消息说

无法将“NSMutableDictionary”的值类型转换为预期的参数类型“[String:NSFileWrapper]”

我不确定什么是 type of [String : NSFileWrapper],一个列表?无论如何将包装器转换为这种类型?

0 投票
0 回答
92 浏览

macos - Cocoa文档增量保存大包

在过去的两天里,我一直在尝试将我的单文件文档打包成一个包,但我无法让它工作。在文档中,它指出首选方法是使用 NSFileWrapper。我已经尝试过了,但这只是处理文件的一种不直观的方式。

我想更新一个文件我需要从它的目录中删除文件包装器,创建一个全新的文件并将其再次添加到目录中。我还没有找到任何明确说明它的东西,但我想我应该只在fileWrapperOfType:error:被调用时更新文件。
由于 NSFileWrapper 将所有内容(至少加载一次)保存在内存中,这意味着我将同时拥有旧版本和新版本,直到用户(或自动保存)保存文件。

似乎 NSFileWrapper 不应该用于大文件,但我认为如果文档所需的所有文件都在包内(可以复制到另一台 Mac/iPhone/iPad 而不会出现错误)会更好不想限制用户文件的数量/大小。

当使用手动的基于 URL 的保存机制时,我最终得到了损坏的包,因为目标目录总是一个临时目录,我找不到任何关于如何合并它们的信息。每次我手动保存文档而不进行任何更改时,都会发生错误,因为我没有向临时目录写入任何内容。但是我没有看到将所有内容写入/链接到临时目录的原因,只是为了将其复制/“取消”链接回其目的地。

由于我似乎找不到正确的答案,保存和恢复包含许多/大文件的大包的最佳做法是什么?

0 投票
0 回答
115 浏览

ios - 如何处理 NSFileWrapper 和并发?

使用NSFileWrapperUIDocument。文件写入发生在:

包装器在 saveMyData() 中修改。

似乎发生的情况是contentsForType在单独的线程上运行,并且在极少数情况下会在 saveMyData 中修改包装器时运行,从而导致“集合在被枚举时发生变异”错误。

我已经阅读了有关 Objective-C 的其他线程@synchronized,但 Swift 等价物仍然让我感到困惑。避免错误的最佳方法是什么?另外,测试错误的最佳方法是什么?它可能会发生 0.001 次,在用户同时更改数据时保存运行的奇怪情况下。

我读到的一种可能的解决方案是使用该defer命令。以下列方式包含objc_sync_enterobjc_sync_exit在 saveMyData() 中是否有效?

不确定哪个线程最终等待另一个线程以及如何等待。

谢谢!

0 投票
0 回答
378 浏览

ios - UIDocument + NSFileWrapper + iCloud = 奇怪的行为

我正在尝试编写一个相当简单的基于 UIDocument 的应用程序,并且我希望每个文档的数据都是包含一些图像文件的父目录。开始时我选择使用 Apple 的 ShapeEdit 示例,因为它似乎可以处理在 iCloud 中保存文件的许多复杂性。它只使用一个 plist 文件作为它的文档数据。

作为第一步,我在 iPad 上启动并运行 ShapeEdit 应用程序,一切都按预期工作。我的应用程序和 iCloud Drive 应用程序在我的 iPad 上以拆分视图运行,因此我可以看到 ShapeEdit 正在创建的文件。正如预期的那样,每次我添加一个新文档时,iCloud Drive 中都会出现一个新文件。

为了迁移 ShapeEdit 应用程序以使用更多文件,我转而使用 NSFileWrapper。当 ShapeEdit 创建一个新文档时,它会复制一个模板文件。我将其更改为仅使用创建一个新文件夹

然后我修改了 UIDocument 代码,让它像这样从 NSFileWrapper 中读取

我还阻碍了文档中的其他一些函数,以返回一个简单的缩略图图像,只是为了让它运行并将 LSTypeIsPackage 设置为 true。最后,我将形状选择 UI 留在那里以触发文档更新

同样,这一切都很好。创建一个新文档会创建一个名为 Untitled.shapeFile 的新目录,它会显示在 iCloud 中。现在是奇怪的第一件事。如果我打开该文档并点击形状选择 UI 以触发更改并等待几秒钟,则会在 iCloud 中显示另一个 Untitled.shapeFile 目录。事实上,每次我这样做时,我都会得到另一个。尽管我的 Mac 上的 iCloud 只有一个副本,但这些似乎只在 iPad 本地。在 iCloud Drive 应用程序中删除这些目录中的任何一个都会导致它们全部被删除。

对于下一步,我向 UIDocument loadFromContents() 函数添加了一些代码

所以每次加载文档时,都会将另一个图像文件添加到父目录。

首先,正如我所希望的那样。打开文档,点击形状选择 UI,看到 MyImage.png 文件出现在 iCloud Drive 中的 Untitled.shapeFile 中。继续关闭和打开,我会得到更多 MyImage.png 文件,前面有一些垃圾,我认为这是 iCloud 防止同名文件的方式,所以一切都很好。除了第二个奇怪的东西。在 iCloud Drive 中显示 MYImage.png 文件后不久,会弹出另一个名为 MyImage 2.png 的文件。如果我继续关闭和打开 MyImage 的所有版本,也会得到一个带有 2 的副本。我编辑的 ShapeEdit 版本从不添加任何具有这种名称格式的图像文件。这些额外的图像也确实出现在 mac 上,因此它们与主文档目录不同。

所以有两件事

1) 为什么我得到多个 Untitled.shapeFile 文档的副本,它们似乎实际上是同一件事?

2)为什么我会得到我的图像文件的额外副本,其中添加了 2,而我的应用程序从未与我有任何关系?

在这让我大吃一惊之前,欢迎提出任何建议。

0 投票
1 回答
254 浏览

swift - 区分 NSFileWrapper 和目录?

我想让我的应用程序文件系统保留有关其中每个文件的元数据,但也支持在用户端创建目录。我看过NSFileWrapper但它似乎将带有元数据的文件保存为目录。这是有道理的,但是现在我如何区分实际目录和NSFileWrapper目录?plist或者我应该使用每个目录中的隐藏文件来跟踪元数据?提前感谢您的帮助!