لماذا يؤدي حفظ الملفات في 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;
}

بمعنى آخر، في الحزمة، قم بإنشاء مجلد "افتراضي"، واحفظ "someFile.ext" فيه مع بعض المحتويات.

الآن المشكلة.عندما أنظر إلى ما تم حفظه بالفعل على القرص، أرى هذا:

screenshot

في كل مرة أقوم فيها بحفظ الملف، يبدو أن غلاف NSDocument يقوم بإنشاء نسخة من المصدر.لا أريد النسخ ذات الإصدار، أريد فقط ملف الفانيليا الذي يحتوي على أحدث محتوى.

من أين تأتي الموارد التي تم إصدارها؟ما الذي يحدث هنا؟هل هناك وثيقة يجب أن أقرأها؟

هل كانت مفيدة؟

المحلول

حسنًا، أعتقد أنني اكتشفت ذلك.كما اتضح، لم تكن في الواقع مشكلة إصدار.يبدو أنك كنت تقوم ببساطة بإضافة ملف جديد في كل مرة.أولا، بعض الملاحظات.

  1. يبدو أنك لا تقوم بإنشاء ملف في حزمة، ولكن "دليل يحتوي على ملف" في حزمة.هل هذا ما كنت تنوي فعله؟
  2. يبدو أنه في حالة عدم وجود الدليل "الافتراضي"، يمكنك إنشاء واستخدام الدليل "someFile.ext"، مما يعني أنه في المرة القادمة يقوم بإنشاء دليل جديد ببادئة غريبة.ومع ذلك، أرى من لقطة الشاشة أن لديك بالفعل دليل "افتراضي"، مما يعني أن هذه ليست مشكلتك.

والآن مشكلتك الحقيقية:وفق هذه الوثائق, addRegularFileWithContents يقوم بإنشاء ملف جديد باسم الملف المفضل لديك، إلا إذا الدليل (defaultWrapper) يحتوي بالفعل على ملف بهذا الاسم (أساسًا).إذا كان هناك بالفعل، فإنه يقوم بإنشاء ملف جديد ببادئة. addRegularFileWithContents تقوم بإرجاع سلسلة تعريف تشير إلى NSFileWrapper الذي تم إنشاؤه (أعتقد أنه اسم الملف).

لذا، ما يحدث هو أنه في كل مرة تذهب فيها لحفظ الملف، فإنه يرى أن هناك بالفعل ملفًا بهذا الاسم، ويقوم بإنشاء ملف جديد ببادئة.إحدى الطرق لحل هذه المشكلة هي الحفاظ على NSString التي تم إرجاعها addRegularFileWithContents, ، ثم عندما تذهب للحفظ، عليك التحقق من defaultWrapper وقم بإزالة NSFileWrapper المرتبط بـ NSString المخزن، إذا كان هناك واحد، ثم قم بإضافة الملف كالمعتاد.لقد قمت بتعديل الكود الخاص بك كما يلي:

@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اسم الملف المفضل هو "افتراضي"، كما أظن أنك قصدت ذلك.
  2. لقد أضفت if الكتلة التي تزيل الملف المحفوظ مسبقًا، إذا كان موجودًا.
  3. لقد طلبت منه تخزين اسم ملف NSFileWrapper الجديد لاستخدامه في المرة القادمة في رقم 2.

بعد هذه التغييرات، أظهر البرنامج ما أعتقد أنه السلوك الذي تتوقعه:دليل واحد يحتوي على ملف واحد، حتى بعد حفظه عدة مرات.لاحظ أن هذا كان صحيحا حتى عندما preservesVersions عاد YES.لست متأكدًا من مكان تخزين إصداراته، لكنني لم أراها.

نصائح أخرى

يمكنك التنفيذ -Writesafely ... بحيث يدعو مباشرة إلى -WRitEtourl: ... تنفيذ -WRitETORL: ... بحيث يستدعي -filewrapperoftype: ... ثم يكتب ذلك إلى عنوان URL بسطوم

ie.e.كنت ستتولى المسؤولية عن المحفز الذري من خلال جعل NSFileWrapper تفعل ذلك.وبهذه الطريقة يجب أن تتبع التفاف بدقة حيث ينتهي الملفات حقا.

مصدر / ص>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top