سؤال

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

NSFileManager*manager = [NSFileManager defaultManager];

NSString*dirToCopyTo = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

NSString*path = [[NSBundle mainBundle] resourcePath];

NSString*dirToCopyFrom = [path stringByAppendingPathComponent:@"Samples"];


NSError*error;

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyFrom error:nil];

for (NSString *file in files)
{
        [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error];

        if (error)
        {
            NSLog(@"%@",[error localizedDescription]);
    }
}

تحرير: لقد قمت للتو بتحرير الكود بالطريقة التي ينبغي أن تكون عليها. الآن ومع ذلك ، هناك مشكلة أخرى:

2010-05-15 13: 31: 31.787 اكتب Mobile [4587: 207] damutabledictionary.h 2010-05-15 13: 31: 31.795 اكتب Mobile [4587: 207] خطأ فيليماناجر: لا يمكن إكمال العملية. الملف موجود

تحرير: لقد أصلحت المشكلة من خلال إخبار NSFileManager بأسماء وجهات الملفات النسخ.

        [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:[dirToCopyTo stringByAppendingPathComponent:file] error:&error];
هل كانت مفيدة؟

المحلول

أعتقد أن المشكلة في هذا السطر:

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyTo error:nil];

أنت تقوم بإدراج الملفات في دليل الوجهة بدلاً من المصدر. قم بتغييره إلى شيء مثل:

NSArray*files = [manager contentsOfDirectoryAtPath:dirToCopyFrom error:nil];

ويجب أن تكون بخير.

نصائح أخرى

أعتقد أن المشكلة هي أن يو تقرأ الملفات لنسخها من Dirtocopyto وأعتقد أنك تعني الأوساخ

أيضًا للحصول على دليل المستندات الذي يجب أن تستخدمه NSDocumentDirectory مع - (nsarray *) urlsfordirectory: (NSSearchPathdirectory) الدليل indomains: (nssearchpathdomainmask) domainmask

يرجى ملاحظة ذلك طويل يجب تجنب التشغيل عند بدء التشغيل:

  1. ليست تجربة مستخدم جيدة (تأخير وسلوك croppy)
  2. يمكن للمنزل في iOS قتل تطبيقك كما لو كان عالقًا.

لذا قم بإجراء نسخة في موضوع ثانوي (أو عملية ... أو أي شيء يستخدم مسار تنفيذ مختلف).

ستنشأ مشكلة أخرى إذا كنت بحاجة إلى بيانات لإلغاء واجهة المستخدم الخاصة بك: في هذه الحالة:

  • تعطيل عناصر واجهة المستخدم
  • ابدأ عملية غير متزامنة / خيوط
  • في مكالمة الانتهاء مرة أخرى للنسخ (عبر الإخطار ، بروتوكول .. أو وسائل أخرى) ، فإن الإخطار بواجهة واجهة المستخدم يمكن أن يبدأ في جلب البيانات.

على سبيل المثال ، نقوم بنسخ ملف zip ونقلله ، لكن الأمر يستغرق بعض الوقت لذلك كان علينا وضعه في إجراء مؤقت يؤدي إلى واجهة المستخدم عند الانتهاء.

إذا كنت بحاجة إلى مثال ، فإنني أعرف.

ملاحظة:
النسخ باستخدام ملف الرمز البريدي أكثر كفاءة على النحو التالي:

  1. فقط اتصل لنظام الملفات
  2. بايت أقل بكثير لنسخ

الأخبار السيئة: يجب عليك استخدام ملف zip روتين DO ، ولكن يمكنك العثور عليه على الويب.

يجب أن يكون إلغاء ضغط ملفات الرمز البريدي أكثر كفاءة لأن هذه المكالمات مكتوبة في C على التوالي ، وليس في الكاكاو مع كل النفقات العامة.

    [manager copyItemAtPath:[dirToCopyFrom stringByAppendingPathComponent:file] toPath:dirToCopyTo error:&error];

مسار الوجهة هو المسار الذي تريد أن يكون للنسخة ، بما فيها اسم الملف. لا يمكنك نقل المسار إلى دليل يتوقع أن يملأ NSFileManager اسم الملف المصدر ؛ لن تفعل هذا.

وثائق يقول أن مسار الوجهة يجب ألا يصف أي شيء موجود:

... يجب أن لا توجد DSTPTHER قبل العملية.

في حالتك ، هو الطريق إلى دليل الوجهة ، لذلك هو يفعل موجود ، وهذا هو السبب في فشل النسخة.

تحتاج إلى جعلها طريقًا إلى الوجهة ملف عن طريق إلحاق اسم الملف المطلوب له. عندها لن تكون موجودة (إن لم يكن نسخها سابقًا) ، وبالتالي ستنجح النسخة.

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