كيف يمكنني نقل / تبديل الملفات بأمان في الكاكاو؟
-
21-09-2019 - |
سؤال
في تطبيق Cocoa الخاص بي ، هناك طريقة تقوم ببعض العمليات على مخطط قاعدة بيانات SQLite التي قد تكون مدمرة ، لذلك أولاً نقوم بعمل نسخة تراجع من قاعدة البيانات ، وإذا كان هناك خطأ ، فإننا نسمي الطريقة التالية لاستبدال ملف DB مع ملف التراجع. لاحظ أنني بالتأكيد أريد استبدال ملف DB بالتراجع!
- (BOOL)restoreDatabaseFromFileAtPath:(NSString *)backupPath error:(NSError **)error {
NSFileManager *fm = [NSFileManager defaultManager];
// get the db paths
NSString *databasePath = [sharedManager pathToDatabase];
// insist that the two files be present
NSAssert1([fm fileExistsAtPath:databasePath], @"no db file at %@", databasePath);
NSAssert1([fm fileExistsAtPath:backupPath], @"no backup db file at %@", backupPath);
// remove the original to make way for the backup
NSLog(@"removing the file at the primary database path...");
if ([fm removeItemAtPath:databasePath error:error]) {
// now move the backup to the original location
NSLog(@"moving the backup file into the primary database path...");
if ([fm moveItemAtPath:backupPath toPath:databasePath error:error]) {
return YES;
}
}
[self presentError:error]; // at this point we're in real trouble
return NO;
}
يعمل الكود المعروض ، ولكنه قد يكون مدمراً للغاية وليست ذرية تمامًا. ما أود فعله حقًا هو شيء أتخيله ، لكن لا يمكنني إيجاد طريقة للقيام بذلك في واجهة برمجة التطبيقات لـ NSFileManager ، شيء مثل:
Bool success = [fm moveFileAtPath:backupPath toPath:databasePath overwriteDestination:YESPLZ error:&error];
الطريقة التي تأتي الأقرب إلى هذه barfs عندما يكتشف أن هناك بالفعل ملف في مسار الوجهة.
تحديث صغير استنادًا إلى الردود حتى الآن:
يجب أن تكون هناك طريقة قياسية تم القيام بها تقليديًا بواسطة Cocoa Devs ، لاستبدال ملف ذري. لا توفر طرق "التحرك" المختلفة لـ NSFileManager منشأة لهذا خارج الصندوق. أيضًا ، تتطلع إلى دعم 10.5 وما فوق في هذا lib وكذلك iPhone OS 3+.
المحلول
المستوى C. fsmoveObjectSync/fsmoveObjectAsync قد تساعد الوظائف. هذه الوظائف تأخذ مجموعة من الخيارات ، والتي يمكن أن تشمل أ العلم للكتابة فوق الوجهة, kFSFileOperationOverwrite
, ، ضمن أشياء أخرى.
نصائح أخرى
ماذا عن NSFileManager
'س replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:
?
أود أن أقترح FSExchangeObjects
, PBExchangeObjectsSync
أو PBExchangeObjectsAsync
وظائف ، لأنها تعمل بالفعل على تبديل محتويات ملفين ذري.
من مكتبة التطوير:
تتيح الوظيفة للبرامج تنفيذ عملية "حفظ آمن" عن طريق إنشاء ملف جديد كامل وكتابةه ومبادلة المحتويات.
بعد التبادل ، سيشير مسار الوصول إلى بيانات الملف المعاكس (أي ، إلى نفس البيانات التي تمت إحالتها في الأصل ، والتي أصبحت الآن جزءًا من الملف الآخر).
متوفر في Mac OS X V10.0 وبعد ذلك.