首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSFileWrapper,延迟加载和保存

NSFileWrapper,延迟加载和保存
EN

Stack Overflow用户
提问于 2013-10-07 15:36:27
回答 3查看 2.4K关注 0票数 13

我有一个基于NSDocument的应用程序,它使用filewrappers保存和加载其数据。文档可以有各种资源,所以我不想把所有的东西都加载到内存中。我可能做了一些根本错误的事情,但是一旦我更改了一个(内部)文件,然后保存,我就无法读取任何没有加载到内存中的文件。

我已经将相关的代码分离成一个单独的项目来再现这种行为,并且我得到了相同的结果。基本流程如下:

  • 我从磁盘加载一个现有的文档。主fileWrapper是一个目录filewrapper (我称之为main),它包含另外两个文件包(sub1和sub2)。这两个内部文件处理程序是,而不是
  • 当用户想编辑sub1时,它是从磁盘加载的。
  • 用户保存文档
  • 如果用户希望编辑另一个文件(sub2),则无法加载该文件。出现的错误: -NSFileWrapper regularFileContents试图懒洋洋地读取文件包装器的内容,但是出现了一个错误:文件无法打开,因为它不存在。

这里是我的项目中的相关代码:

在下面的gist:https://gist.github.com/bob-codingdutchmen/6869871中,这段代码可能更容易阅读。

代码语言:javascript
复制
#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并添加一个新的。这是我找到的唯一改变文件内容的方法,也是我在其他答案中看到的方式。
  • 当从磁盘加载文档时,我保留fileWrapper以便可以使用它(在上面的代码中称为myWrapper )。

Apple说NSFileWrapper支持延迟加载和增量保存,所以我假设我的代码有一些我看不到的基本缺陷。

EN

回答 3

Stack Overflow用户

发布于 2013-11-11 06:39:41

NSFileWrapper本质上是unix文件节点的包装器。如果文件被移动,包装器将保持有效。

你似乎遇到的问题是,在保存过程中创建一个新的文件包装器是一个新文件夹。系统将删除前面的包装器,包括sub2。

要实现您想要的目标,您需要更改为增量保存,即只保存已更改的部分。请参阅NSDocument中的“就地保存”。

票数 1
EN

Stack Overflow用户

发布于 2014-01-14 00:45:36

在您的-fileWrapperOfType:error:方法中,尝试构建一个新的文件包装器,其中包含更改成员的新内容,并为未更改的成员引用旧的文件包装器。

票数 1
EN

Stack Overflow用户

发布于 2014-03-26 16:15:53

按照addFileWrapper的文档:向它添加一个子目录(子目录),意味着

目录/

  1. addfileWrapper:fileName1目录/fileName1/
  2. addfileWrapper:fileName2目录/fileName1/fileName2。那个文件不存在。

您必须使用addRegularFileWithContents:preferredFilename:而不是。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19228884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档