كيف يمكنني نقل / تبديل الملفات بأمان في الكاكاو؟

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

  •  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, ، ضمن أشياء أخرى.

نصائح أخرى

ماذا عن NSFileManagerreplaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:?

انظر الوثائق هنا

أود أن أقترح FSExchangeObjects, PBExchangeObjectsSync أو PBExchangeObjectsAsync وظائف ، لأنها تعمل بالفعل على تبديل محتويات ملفين ذري.

من مكتبة التطوير:

تتيح الوظيفة للبرامج تنفيذ عملية "حفظ آمن" عن طريق إنشاء ملف جديد كامل وكتابةه ومبادلة المحتويات.

بعد التبادل ، سيشير مسار الوصول إلى بيانات الملف المعاكس (أي ، إلى نفس البيانات التي تمت إحالتها في الأصل ، والتي أصبحت الآن جزءًا من الملف الآخر).

متوفر في Mac OS X V10.0 وبعد ذلك.

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