هل أنا مجنون؟ مساعدة في طريقة تفويض NSFileManager يجب أن يكون هناك procedaftererror في 10.5+

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

سؤال

لذلك أنا نوع من الكاكاو N00B ، لكنني أكتب هذا البرنامج البسيط البسيط ولا يمكنني الحصول على طريقة مندوب NSFileManager "shouldproCteeftererror ..." لإطلاق النار. إليك الرمز الذي أقوم بتشغيله في AppDelegate الخاص بي

-(BOOL)copyFile {
    [[NSFileManager defaultManager] setDelegate:self];

    NSError *copyError = nil;
    NSString *filename = [[NSString alloc] initWithString:[[[self.sourceFile path] componentsSeparatedByString:@"/"] lastObject]];
    NSString *destination = [[[[[UserData sharedData] folderLocation] path] stringByAppendingString:@"/"] stringByAppendingString:filename];

    [[NSFileManager defaultManager] copyItemAtPath:[self.sourceFile path] toPath:destination error:&copyError];

    NSLog(@"error! %@",copyError);

    [filename release];
    return YES;
}

- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error copyingItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath {
    NSLog(@"more error... %@",error);
    return NO;
}
- (BOOL)fileManager:(NSFileManager *)fileManager shouldCopyItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath {
    NSLog(@"in shouldCopyItemAtPath...");
    return YES;
}

الموقف الذي أحاول التعامل معه هو إذا كان الملف موجودًا بالفعل في الوجهة. أحصل على خطأ ، لكنني لا أحصل على تتبع "المزيد من الخطأ ..." للإخراج. أنا أيضًا أحصل على هذا التتبع من shouldcopyitematpath: لذلك لست متأكدًا تمامًا من سبب عدم إطلاق الطريقة؟

هل أنا مجنون ، كيف أفسدت تطبيق المندوب هنا؟ شكرا على اي مساعدة!

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

المحلول

هذه مجرد فرضية ، ولكن منذ CopyItematpath: Topath: تم تعريف الخطأ على هذا النحو "يجب أن يكون الملف المحدد في SRCPath ، في حين يجب أن لا يكون DSTPath موجودًا قبل العملية.", ، ربما لا يعتبر السيناريو الذي يوجد فيه DSTPath بالفعل "خطأ" ، وبالتالي لا يطلق المندوب.

أي ربما "هذا ليس خطأ إذا قمت بشيء قلنا لك ألا تفعل."

يمكنك دائمًا إجراء الشيك وحذفه بنفسك:

NSFileManager* fileManager = [NSFileManager defaultManager];

// Delete the file if it already exists.
if ([fileManager fileExistsAtPath: destination])
        if (![fileManager removeItemAtPath: destination error: error])
                return NO;

return [fileManager copyItemAtPath: source toPath: destination error: error];

نصائح أخرى

ربما كنت تقدم مسارًا خاطئًا كمصدر؟
copyItemAtPath لا يستدعي أساليب المندوب إذا كان مسار المصدر غير صالح.
يمكنك اختبار ذلك إذا كنت تستخدم الطريقة التالية:

-(IBAction)copyFile:(id)sender
{
    [[NSFileManager defaultManager] setDelegate:self];
    NSError* copyError = nil;
    NSString* sourceFilepath = [@"~/Desktop/source.txt" stringByExpandingTildeInPath];
    NSString* targetFilepath = [@"~/Desktop/target.txt" stringByExpandingTildeInPath];  
    [[NSFileManager defaultManager] copyItemAtPath:sourceFilepath toPath:targetFilepath error:&copyError];  
    NSLog(@"Error:%@", copyError);  
}

عند استدعاء هذه الطريقة ، لاحظت السلوك التالي:

  • إذا كان ~/desktop/source.txt عبارة عن ملف ولا يوجد ~/desktop/target.txt:
    • NSFileManager يدعو shouldCopyItemAtPath طريقة تفويض
  • إذا كان ~/desktop/source.txt هو ملف و ~/desktop/target.txt موجود:
    • NSFileManager يدعو أولاً shouldCopyItemAtPath و shouldProceedAfterError
  • إذا كان ~/سطح المكتب/source.txt غير موجود
    • NSFileManager لا يدعو أي طريقة مندوب ويعيد فقط nserror objet
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top