هل أنا مجنون؟ مساعدة في طريقة تفويض NSFileManager يجب أن يكون هناك procedaftererror في 10.5+
-
21-09-2019 - |
سؤال
لذلك أنا نوع من الكاكاو 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:©Error];
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:©Error];
NSLog(@"Error:%@", copyError);
}
عند استدعاء هذه الطريقة ، لاحظت السلوك التالي:
- إذا كان ~/desktop/source.txt عبارة عن ملف ولا يوجد ~/desktop/target.txt:
- NSFileManager يدعو
shouldCopyItemAtPath
طريقة تفويض
- NSFileManager يدعو
- إذا كان ~/desktop/source.txt هو ملف و ~/desktop/target.txt موجود:
- NSFileManager يدعو أولاً
shouldCopyItemAtPath
وshouldProceedAfterError
- NSFileManager يدعو أولاً
- إذا كان ~/سطح المكتب/source.txt غير موجود
- NSFileManager لا يدعو أي طريقة مندوب ويعيد فقط nserror objet