2009-07-15 24 views
8

Tôi đang cố gắng sao chép tệp mp3 từ thư mục Tài nguyên của mình vào thư mục bên trong thư mục "Tài liệu" của ứng dụng. Trên giả lập này hoạt động tốt. Nhưng khi tôi chạy nó trên một thiết bị, sao chép các tập tin mang lại cho tôi lỗi nàyiPhone - sao chép tệp từ tài nguyên sang Tài liệu đưa ra lỗi

Operation could not be completed. (Cocoa error 513.) 

Đường dẫn nguồn và đích là tốt nhưng tôi vẫn không thể sao chép tệp. Bất kỳ ý tưởng? Tôi có thể tìm hiểu mã lỗi 513 ở đâu?

Cảm ơn.

Dưới đây là mã nguồn có liên quan

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 

    NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:@"Files"]; 

    NSString *insPath = [NSString stringWithFormat:@"%@.mp3", fileName]; 
    NSString *srcPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:insPath]; 
    NSString *destPath = [folderPath stringByAppendingPathComponent:insPath]; 
    NSLog(@"Src: %@, Dest: %@", srcPath, destPath); 

    NSError *err; 
    [fileManager moveItemAtPath:srcPath toPath:destPath error:&err]; 

    NSLog(@"Err desc-%@", [err localizedDescription]); 
    NSLog(@"Err reason-%@", [err localizedFailureReason]); 

Trước khi thực hiện một cuộc gọi đến moveItemAtPath, tôi cũng đang tạo ra những thư mục "Files" và nó trả về một YES.

Dưới đây là các bản ghi kết quả

Src: /var/mobile/Applications/512D7565-7EF7-4C13-A015-19EEC3F3B465/MyApp.app/MyFile.mp3, Dest: /var/mobile/Applications/512D7565-7EF7-4C13-A015-19EEC3F3B465/Documents/Files/MyFile.mp3 

Err desc-Operation could not be completed. (Cocoa error 513.) 
Err reason-(null) 

Một câu hỏi

Có giới hạn kích thước tập tin khi sao chép dữ liệu từ nguồn vào thư mục Documents? Tệp tôi đang cố gắng sao chép là khoảng 5MB. Đó có thể là một lý do?

+0

dup có thể có của: http://stackoverflow.com/questions/912828/how-do-i-fix-cocoa-error-513 – notnoop

+0

Đã thấy câu hỏi rồi. Giải pháp ở đó không giúp được sự cố của tôi – lostInTransit

+0

có thể sẽ giúp ích nếu bạn có thể đưa mã vào để sao chép tệp. – notnoop

Trả lời

19

EDIT:

Chỉ cần tìm ra một giải pháp thậm chí đơn giản hơn.Thay vì moveItemAtPath: toPath: error :, chỉ cần sử dụng copyItemAtPath: toPath: error: ... vì chúng tôi thực sự muốn sao chép tệp từ mainBundle và không di chuyển nó. Tôi nên nghĩ về điều đó sớm hơn!

Ví dụ:

[[NSFileManager defaultManager] copyItemAtPath:mainBundleFilePath 
             toPath:destPath 
             error:&err] 

Xem nhận xét trước của tôi bên dưới về lý do hoạt động này.


Tôi tin rằng tôi có câu trả lời cho câu hỏi này. Tôi có thể nói chắc chắn rằng vấn đề không phải là đường dẫn tệp đích.

tôi đã nhận được báo lỗi Cocoa cùng 513 (NSFileWriteNoPermissionError) với khá nhiều mã chính xác như nhau:

[[NSFileManager defaultManager] moveItemAtPath:mainBundleFilePath 
             toPath:destPath 
             error:&err] 

Vấn đề dường như là các tập tin, đến từ các mainBundle, không có quyền thích hợp được chuyển đến nơi khác. Tôi không chắc liệu lệnh này, nếu được thực thi, sẽ thực sự di chuyển tệp từ mainBundle hoặc chỉ sao chép nó ... nhưng dù theo cách nào, trình quản lý tệp dường như không thích ý tưởng đó.

Giải pháp rất đơn giản: chỉ cần đọc tệp mainBundle vào đối tượng NSData và sau đó ghi NSData vào tệp mới. Lưu ý đường dẫn tệp đích giống nhau trong cả hai ví dụ, cho chúng ta thấy rằng lostInTransit là chính xác khi nói rằng đường dẫn tệp của nó là OK.

Ví dụ này, sau đó, đoạn code sau sẽ làm việc và không ném ra một lỗi:

NSData *mainBundleFile = [NSData dataWithContentsOfFile:mainBundleFilePath]; 
[[NSFileManager defaultManager] createFileAtPath:destPath 
             contents:mainBundleFile 
             attributes:nil]; 

BTW, trong mã của riêng tôi, thay vì đi qua một con số không cho các thuộc tính :, tôi thiết lập một NSDictionary với thuộc tính NSFileModificationDate. Tôi cũng bọc các thuộc tính createFileAtPath: contents: trong một lỗi khi đưa ra câu lệnh if. Nói cách khác,

if (![[NSFileManager defaultManager] createFileAtPath:destPath 
              contents:mainBundleFile 
              attributes:myAttributes]) { 
// handle error as necessary, etc... 

}

Tôi đã mất một thời gian để tìm tất cả những điều này ra, vì vậy hy vọng giải pháp này sẽ rất hữu ích cho người khác.

+0

Cảm ơn Larry. Bị mắc kẹt trong cái này quá lâu! – lostInTransit

+1

Có thể vấn đề ban đầu là khi bạn cố di chuyển tệp, bạn yêu cầu chương trình thay đổi gói tài nguyên của nó (bằng cách xóa nó sau khi sao chép). Tôi không nghĩ rằng các gói tài nguyên có thể được thay đổi trên iPhone (nhưng nó có thể được trên Simulator). –

+0

Đồng ý - cũng tóm tắt Nevan.Phần quan trọng đối với tôi là việc nhận ra NSFileWriteNoPermissionError liên quan đến vị trí nguồn (gói tài nguyên) và không phải là vị trí đích. Ngoài ra, trong trường hợp này, lỗi cho phép ngăn chặn cả hai phần của tác vụ di chuyển - bản sao và xóa. –

3

Bạn có chắc chắn bạn đang nhận đường dẫn đến thư mục Tài liệu chính xác không? Đường dẫn tuyệt đối trong trình mô phỏng khác với đường dẫn tuyệt đối trên thiết bị.

Bạn nên sử dụng sau đây để đảm bảo bạn sẽ có được con đường đúng vào thư mục Documents:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

Đường dẫn cho documentsDirectory trên thiết bị sẽ là một cái gì đó như:

/var/mobile/Applications/30B51836-D2DD-43AA-BCB4-9D4DADFED6A2/Documents

đường dẫn trên trình giả lập sẽ là một cái gì đó như:

/Volumes/Stuff/Hỗ trợ Users/johndoe/Library/Application/iPhone Simulator/User/Applications/118086A0-FAAF-4CD4-9A0F-CD5E8D287270/Documents

Bạn có thể đọc thêm trên trang mạng tin & trên dev site.

+0

Cảm ơn Michael. Tôi đang nhận được đường dẫn chính xác trên thiết bị. Tôi biết vì tôi đang truy cập các tệp khác từ cùng thư mục với nơi tôi đang cố sao chép các tệp này mà không gặp sự cố. Tôi đã đi qua các tập tin và n/w trang trước khi gửi câu hỏi nhưng không thể tìm thấy bất cứ điều gì mà sẽ giúp tôi giải quyết vấn đề. – lostInTransit

2

Đó là NSFileWriteNoPermissionError:

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Constants/Reference/reference.html

Bằng cách nào đó, bạn không có con đường sai lầm và nó không cho phép bạn viết ở đó. Bạn cũng có thể xóa ứng dụng và thử lại, trong trường hợp bằng cách nào đó, thư mục tài liệu ứng dụng của bạn được đặt thành quyền sai ...

Tôi sẽ cung cấp cho chúng tôi dòng mã làm bản sao và in ra từng biến được sử dụng trong dòng đó. Sau đó chúng ta có thể thấy vấn đề là gì.

+0

đã thêm mã nguồn vào câu hỏi. cảm ơn – lostInTransit

+0

Một khởi đầu tốt, có vẻ OK cho đến nay - bạn cũng có thể thêm kết quả nhật ký (đặc biệt là src: dst: line) –

+0

Tôi gặp sự cố tương tự, đã gỡ lỗi trong một giờ và xóa và cài đặt lại ứng dụng, như bạn đã đề xuất, giải quyết vấn đề của tôi !. cảm ơn. – nacho4d

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