2010-07-14 37 views
8

Tôi đang cố sao chép một số tệp từ gói ứng dụng của tôi sang thư mục tài liệu khi khởi chạy lần đầu tiên. Tôi có kiểm tra tại chỗ cho lần ra mắt đầu tiên, nhưng chúng không được bao gồm trong đoạn mã để rõ ràng. Vấn đề là tôi đang sao chép vào thư mục tài liệu (mà đã tồn tại) và trong tài liệu, nó khẳng định rằng:iPhone (iOS): sao chép các tệp từ gói chính sang lỗi thư mục tài liệu

dstPath không phải tồn tại trước khi phẫu thuật.

Cách tốt nhất để tôi thực hiện việc sao chép trực tiếp vào tài liệu gốc là gì? Lý do tôi muốn làm điều này là để cho phép hỗ trợ chia sẻ tập tin iTunes.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Populator"]; 

    NSLog(@"\nSource Path: %@\nDocuments Path: %@", sourcePath, documentsDirectory); 

    NSError *error = nil; 

    if([[NSFileManager defaultManager] copyItemAtPath:sourcePath toPath:documentsDirectory error:&error]){ 
    NSLog(@"Default file successfully copied over."); 
    } else { 
    NSLog(@"Error description-%@ \n", [error localizedDescription]); 
    NSLog(@"Error reason-%@", [error localizedFailureReason]); 
    } 
    ... 
    return YES; 
} 

Cảm ơn

Trả lời

11

con đường đích của bạn phải chứa tên của item được sao chép, không chỉ là thư mục tài liệu. Hãy thử:

if([[NSFileManager defaultManager] copyItemAtPath:sourcePath 
      toPath:[documentsDirectory stringByAppendingPathComponent:@"Populator"] 
      error:&error]){ 
... 

Edit: Xin lỗi hiểu sai câu hỏi của bạn. Không biết nếu có một tùy chọn tốt hơn sau đó lặp qua nội dung thư mục và sao chép từng mục riêng biệt. Nếu bạn đang nhắm mục tiêu iOS4, bạn có thể sử dụng chức năng -enumerateObjectsUsingBlock: của NSArray cho điều đó:

NSArray* resContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:copyItemAtPath:sourcePath error:NULL]; 
[resContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) 
    { 
     NSError* error; 
     if (![[NSFileManager defaultManager] 
        copyItemAtPath:[sourcePath stringByAppendingPathComponent:obj] 
        toPath:[documentsDirectory stringByAppendingPathComponent:obj] 
        error:&error]) 
      DLogFunction(@"%@", [error localizedDescription]); 
    }]; 

P.S. Nếu bạn không thể sử dụng các khối, bạn có thể sử dụng liệt kê nhanh:

NSArray* resContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:copyItemAtPath:sourcePath error:NULL]; 

for (NSString* obj in resContents){ 
    NSError* error; 
    if (![[NSFileManager defaultManager] 
       copyItemAtPath:[sourcePath stringByAppendingPathComponent:obj] 
       toPath:[documentsDirectory stringByAppendingPathComponent:obj] 
       error:&error]) 
      DLogFunction(@"%@", [error localizedDescription]); 
    } 
+0

Cảm ơn bạn đã phản hồi, nhưng đây không phải là điều tôi muốn làm. Những gì tôi muốn làm là sao chép nội dung của thư mục Populator vào thư mục gốc (không phải là thư mục có tên Populator trong thư mục gốc của tài liệu). Những gì bạn đang nói để làm không làm việc, nhưng không phải là những gì tôi muốn đạt được. – Jack

+0

Cảm ơn rất nhiều, sự hiểu lầm gần như chắc chắn là lỗi của tôi. Tôi đang sử dụng mã này cho một ứng dụng iPad, vì vậy sẽ nhắm mục tiêu iOS 3.2, mặc dù cuối cùng điều này sẽ hỗ trợ iOS4. Cảm ơn bạn cho mã của bạn, bất kỳ ý tưởng làm thế nào để có được nó làm việc cho 3,2 (không có khối)? – Jack

+1

Tôi đã thêm mã bằng cách sử dụng liệt kê nhanh. giải pháp khối là nhiều hơn để tập thể dục bản thân mình - khối là một khái niệm mới cho tôi. – Vladimir

6

một lưu ý:
không hành hoạt động kéo dài trong didFinishLaunchingWithOptions: là một sai lầm về khái niệm. Nếu bản sao này mất quá nhiều thời gian, cơ quan giám sát sẽ giết bạn. khởi chạy nó trong một chủ đề thứ cấp hoặc NSOperation ... Cá nhân tôi sử dụng bộ hẹn giờ proc.

Các vấn đề liên quan