- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个基于 NSDocument 的应用程序,它使用文件包装器来保存和加载其数据。文档可以有各种资源,所以我不想把所有东西都加载到内存中。我可能在做一些根本性的错误,但是一旦我更改了一个(内部)文件然后保存,我就无法读取任何尚未加载到内存中的文件。
我已将相关代码分离到一个单独的项目中以重现此行为,我得到了相同的结果。基本流程是这样的:
如果用户想要编辑其他文件 (sub2),则无法加载。出现的错误:
-[NSFileWrapper regularFileContents] tried to read the file wrapper's contents lazily but an error occurred: The file couldn’t be opened because it doesn’t exist.
下面是我项目中的相关代码:
这段代码在这个要点中可能更容易阅读: https://gist.github.com/bob-codingdutchmen/6869871
#define FileName01 @"testfile1.txt"
#define FileName02 @"testfile2.txt"
/**
* Only called when initializing a NEW document
*/
-(id)initWithType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
self = [self init];
if (self) {
self.myWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
NSLog(@"Initializing new document...");
NSString *testString1 = @"Lorem ipsum first sub file";
NSString *testString2 = @"This is the second sub file with completely unrelated contents";
NSFileWrapper *w1 = [[NSFileWrapper alloc] initRegularFileWithContents:[testString1 dataUsingEncoding:NSUTF8StringEncoding]];
NSFileWrapper *w2 = [[NSFileWrapper alloc] initRegularFileWithContents:[testString2 dataUsingEncoding:NSUTF8StringEncoding]];
w1.preferredFilename = FileName01;
w2.preferredFilename = FileName02;
[self.myWrapper addFileWrapper:w1];
[self.myWrapper addFileWrapper:w2];
}
return self;
}
-(NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
// This obviously wouldn't happen here normally, but it illustrates
// how the contents of the first file would be replaced
NSFileWrapper *w1 = [self.myWrapper.fileWrappers objectForKey:FileName01];
[self.myWrapper removeFileWrapper:w1];
NSFileWrapper *new1 = [[NSFileWrapper alloc] initRegularFileWithContents:[@"New file contents" dataUsingEncoding:NSUTF8StringEncoding]];
new1.preferredFilename = FileName01;
[self.myWrapper addFileWrapper:new1];
return self.myWrapper;
}
-(BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError *__autoreleasing *)outError {
self.myWrapper = fileWrapper;
return YES;
}
- (IBAction)button1Pressed:(id)sender {
// Read from file1 and show result in field1
NSFileWrapper *w1 = [[self.myWrapper fileWrappers] objectForKey:FileName01];
NSString *string1 = [[NSString alloc] initWithData:w1.regularFileContents encoding:NSUTF8StringEncoding];
[self.field1 setStringValue:string1];
}
- (IBAction)button2Pressed:(id)sender {
// Read from file2 and show result in field2
NSFileWrapper *w2 = [[self.myWrapper fileWrappers] objectForKey:FileName02];
NSString *string2 = [[NSString alloc] initWithData:w2.regularFileContents encoding:NSUTF8StringEncoding];
[self.field2 setStringValue:string2];
}
底部的两个方法仅用于更新 UI,因此我可以看到会发生什么。
为了更改文件的内容,我删除了现有的 fileWrapper 并添加了一个新的。这是我发现更改文件内容的唯一方法,也是我在其他 SO 答案中看到的方法。
当从磁盘加载文档时,我会保留 fileWrapper 以便我可以使用它(在上面的代码中称为 myWrapper)
Apple 文档说 NSFileWrapper 支持延迟加载和增量保存,所以我假设我的代码有一些我看不到的基本缺陷。
最佳答案
NSFileWrapper 本质上是一个 unix 文件节点的包装器。如果文件被移动,包装器仍然有效。
您似乎遇到的问题是在保存过程中创建一个新的文件包装器是一个新文件夹。并且系统会删除您之前的包装器,包括 sub2。
要实现您想要的效果,您需要更改为增量保存,即仅将更改的部分保存到位。请参阅 NSDocument 中的“就地保存”。
关于objective-c - NSFileWrapper,延迟加载和保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19228884/
我们正在将一个包含大量跨平台代码的应用程序移植到 Cocoa。必须使用直接对磁盘上的文件进行加载/保存的低级文件处理例程。 由于 NSFileWrapper 旨在通过 NSData 呈现内存中文件的内
我正在创建一个 NSDocument 包,其中可能包含数百个大文件,因此我不想在打开文档时读取全部内容。 我花了一些时间寻找,但找不到明确的答案。大多数人似乎认为 NSFileWrapper 将所有数
假设我有一个 NSFileWrapper 目录。该目录由几级目录和文件组成。有些文件很大。这些文件是全部加载到内存中,还是延迟加载? 如果它们被加载到内存中,是否有任何替代 NSFileWrapper
我有一个 NSFileWrapper 目录,我想在其中更新某个 FileWrapper。我想知道最好的方法是什么? 到目前为止,我已经使用了这段代码: [self.fileWrapper addReg
我有一个 UIDocument,我希望它由 (1) 一个 txt 文件和 (2) 几个 jpg 图像组成。我将 txt 和所有 jpg 放入 NSFileWrapper 中。 当我加载 UIDocum
我正在使用 NSFileWrapper 作为我的包文档。有时,当我请求包内文件的数据时,我得到nil。 这是我查询包内文件数据的方法: - (NSData*) dataOfFile(NSString*
我有一个应用程序正在使用 NSFileWrapper 创建用户数据的备份。此备份文件包含文本和媒体文件(此处与压缩无关)。有时这些备份文件会变得非常大,超过 200 MB。当我调用 NSFileWra
我们最近将代码转换为使用 UIDocument 而不是直接在文件系统上操作文件,因此我们遇到了一些性能问题。我们想知道我们是否错误地使用了这个类,是否有其他人遇到过这些问题,以及解决这些问题的常用方法
我想让我的应用程序文件系统保留其中每个文件的元数据,但也支持在用户端创建目录。我看过 NSFileWrapper 但它似乎将带有元数据的文件保存为目录。这是有道理的,但是现在我如何区分实际目录和 NS
我有一个基于 NSDocument 的应用程序,它使用文件包装器来保存和加载其数据。文档可以有各种资源,所以我不想把所有东西都加载到内存中。我可能在做一些根本性的错误,但是一旦我更改了一个(内部)文件
给定一个 NSFileWrapper 对象(用于文件或目录),是否有任何方法可以获取磁盘上实际文件位置的完整路径? [fileWrapper filename] 只返回文件名,而不是路径,所以这不是我
我正在制作一个基于文档的 Cocoa 应用程序,其中文档是动态文件的集合(用户可以添加或删除文件)。特别是,保存和打开操作应尽可能快。 如果我正确理解文档,我应该使用 NSFileWrapper并实现
我在将 NSFileWrapper 文档与 iCloud 同步时遇到问题。我能够创建我的包装器并将其保存到我无处不在的容器中。 当我尝试从创建它的设备读取它时,它起作用了。当我尝试从另一台从 iClo
很抱歉,如果这很明显,但我正在为如何从 NSFileWrapper 和 docs were not particular enlightening. 中提取组件而苦苦挣扎。 我有两个包装器。一个包含一
如何播放给定 NSFileWrapper 的电影? 我希望在 MPMoviePlayerController 中找到一个 initWithData: 构造函数(如 AVAudioPlayer ),但只
我正在查看 NSFileWrapper 类,它在 iOS 上将许多文件组合成一个逻辑文件。 ( demo ) 其他平台如何与这种格式互动?通过电子邮件/http 发送此文档类型时会发生什么情况? 最佳
NSFileWrapper 的 serializedRepresentation 在导入 Cocoa 框架时返回不适当的大数据,而不仅仅是导入 Foundation 框架。我怎样才能阻止 serial
我有一个基于 UIDocument 的应用程序,它使用 NSFileWrapper 来存储数据。 “主”文件包装器包含许多其他目录文件包装器,每个包装器代表文档的不同页面。 每当我在保存 UIDocu
我有一个基于 UIDocument 的应用程序,它使用 NSFileWrapper 来存储数据。 “主”文件包装器包含许多其他目录文件包装器,每个包装器代表文档的不同页面。 当保存一个只有一小部分页面
我有以下 Objective-C 代码: NSFileWrapper* fileWrapper; NSMutableDictionary* wrappers = [NSMutableDictionar
我是一名优秀的程序员,十分优秀!