파일을 NSDocument에 저장하면 이름에 이상한 문자가 포함된 동일한 파일 버전이 생성되는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com//questions/22046035

문제

저는 문서 유형이 여러 파일이 포함된 패키지 번들인 NSDocument 기반 애플리케이션을 작업하고 있습니다.저는 이렇게 저장합니다.

- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError
{
    if (!self.documentFileWrapper) {
        NSFileWrapper *documentFileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
        [self setDocumentFileWrapper:documentFileWrapper];
    }

    NSFileWrapper *defaultWrapper = [self.documentFileWrapper.fileWrappers objectForKey:@"default"];
    if (!defaultWrapper) {
        defaultWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
        [defaultWrapper setPreferredFilename:@"someFile.ext"];
        [self.documentFileWrapper addFileWrapper:defaultWrapper];
    }

    [defaultWrapper addRegularFileWithContents: ... some computed content for the file ... preferredFilename:@"someFile.ext"];

    return self.documentFileWrapper;
}

즉, 번들에 "default" 폴더를 만들고 여기에 일부 내용과 함께 "someFile.ext"를 저장합니다.

이제 문제입니다.실제로 디스크에 저장된 내용을 살펴보면 다음과 같습니다.

screenshot

파일을 저장할 때마다 NSDocument 래퍼가 리소스의 일부 버전 복사본을 생성하는 것 같습니다.버전이 지정된 복제본은 원하지 않고 최신 콘텐츠가 포함된 바닐라 파일만 원합니다.

버전이 지정된 리소스는 어디에서 제공되나요?여기서 무슨 일이 일어나고 있는 걸까요?읽어야 할 문서가 있나요?

도움이 되었습니까?

해결책

알았어, 알아낸 것 같아.알고 보니 실제로는 버전 관리 문제가 아니었습니다.매번 새 파일을 추가하는 것 같았습니다.먼저 몇 가지 참고사항입니다.

  1. 패키지에 파일을 생성하는 것이 아니라 패키지에 '파일이 포함된 디렉터리'를 생성하는 것으로 보입니다.그게 당신이 할 의도였나요?
  2. "default" 디렉터리가 존재하지 않으면 "someFile.ext" 디렉터리를 생성하여 사용하는 것 같습니다. 이는 다음에 이상한 접두어를 가진 새 디렉터리를 생성한다는 의미입니다.그러나 스크린샷을 보면 이미 "default" 디렉토리가 있다는 것을 알 수 있습니다. 이는 이것이 문제가 아니라는 것을 의미합니다.

이제 실제 문제는 다음과 같습니다.~에 따르면 이 문서, addRegularFileWithContents 원하는 파일 이름으로 새 파일을 생성합니다. ~하지 않는 한 디렉토리(defaultWrapper)에는 (기본적으로) 해당 이름을 가진 파일이 이미 포함되어 있습니다.이미 있는 경우 접두사가 있는 새 파일이 생성됩니다. addRegularFileWithContents 생성된 NSFileWrapper를 참조하는 식별 문자열을 반환합니다(파일 이름인 것 같습니다).

따라서 파일을 저장하려고 할 때마다 해당 이름의 파일이 이미 있음을 확인하고 접두사가 붙은 새로운 파일을 생성합니다.이 문제를 해결하는 한 가지 방법은 다음에서 반환된 NSString을 유지하는 것입니다. addRegularFileWithContents, 저장으로 이동하여 다음을 확인하세요. defaultWrapper 저장된 NSString과 연관된 NSFileWrapper가 있으면 제거한 다음 평소와 같이 파일을 추가하십시오.귀하의 코드를 다음과 같이 수정했습니다.

@interface TestDocument () // Relevant part of my test class.  Note `wrapperFileName`.

@property (nonatomic, strong) NSFileWrapper *documentFileWrapper;
@property (nonatomic, strong) NSString *wrapperFileName;

@end



- (NSFileWrapper *)fileWrapperOfType:(NSString *)typeName error:(NSError **)outError
{
    if (!self.documentFileWrapper) {
        NSFileWrapper *documentFileWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
        [self setDocumentFileWrapper:documentFileWrapper];
    }

    NSFileWrapper *defaultWrapper = [self.documentFileWrapper.fileWrappers objectForKey:@"default"];
    if (!defaultWrapper) {
        defaultWrapper = [[NSFileWrapper alloc] initDirectoryWithFileWrappers:nil];
        [defaultWrapper setPreferredFilename:@"default"];
        [self.documentFileWrapper addFileWrapper:defaultWrapper];
    } else if (self.wrapperFileName) {
        [defaultWrapper removeFileWrapper:[[defaultWrapper fileWrappers] objectForKey:self.wrapperFileName]];
    }

    self.wrapperFileName = [defaultWrapper addRegularFileWithContents:[@"blah blah" dataUsingEncoding:NSUTF8StringEncoding] preferredFilename:@"someFile.txt"];
    return self.documentFileWrapper;
}
  1. 나는 defaultWrapper당신이 의도한 대로 의 선호하는 파일 이름은 "default"입니다.
  2. 나는 if 이전에 저장된 파일이 있는 경우 이를 제거하는 블록입니다.
  3. 다음에 #2에서 사용할 수 있도록 새 NSFileWrapper의 파일 이름을 저장했습니다.

이러한 변경 후에 프로그램은 여러분이 기대하는 동작을 보여주었습니다.여러 번 저장한 후에도 하나의 파일이 포함된 하나의 디렉토리입니다.이는 심지어 다음과 같은 경우에도 마찬가지였습니다. preservesVersions 반환 YES.버전이 어디에 저장되어 있는지 잘 모르겠지만 해당 버전을 보지 못했습니다.

다른 팁

구현할 수 있습니다. 그래서 똑바로 전화를 걸어 --writetourl : ... 구현 -writeTourl : ...이므로 전화를 걸려면 다음과 같이 원자

을 씁니다.

i.e.NSFileWrapper가해서 원자력 저장에 대한 책임을지지 않을 것입니다.그런 식으로 래퍼는 파일이 실제로 끝나는 위치를 깔끔하게 추적해야합니다.

소스 <./ P>

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top