2011-10-15 38 views
21

Tôi muốn thêm một số tệp tĩnh (hình ảnh, nhị phân, v.v ...) vào ứng dụng của mình. Tôi đã đặt chúng dưới một thư mục có tên là Resources và đã thêm nó vào dự án XCode của tôi.Cách truy cập các tệp cục bộ trong dự án

Tiếp theo, tôi có các tệp đó được thêm vào Copy Bundle Resources trong tab Build Phases trong cài đặt dự án.

Tuy nhiên, tôi dường như không thể đề cập đến chúng đúng cách.

Ví dụ, đọc một tập tin nhị phân:

NSInputStream *is = [[NSInputStream alloc] initWithFileAtPath:@"data.bin"]; 
if(![is hasBytesAvailable]) NSLog(@"wrong"); 

này luôn thất bại & in wrong

Tôi đã thử một cách tiếp cận tương tự với NSData initWithContentsOfFile: nhưng điều này thậm chí sẽ không thực thi. Một nỗ lực khác là sử dụng [NSBundle mainBundle] nhưng điều này cũng không thực hiện đầy đủ.

Tôi mới sử dụng iOS, hãy giúp tôi có thể truy cập các tệp cục bộ của mình! Bất kỳ trợ giúp sẽ được đánh giá cao.

Cảm ơn bạn,

+0

Trường hợp này có đúng không? iOS phân biệt chữ hoa chữ thường, do đó, 'Data.BIN' và' data.bin' là hai tệp khác nhau. – DarkDust

+0

tất cả các trường hợp thấp hơn: ( – chizzle

Trả lời

28

Bạn cần đảm bảo rằng bạn đang truy cập tệp ở đúng nơi. Xcode đặt các tệp tài nguyên của bạn vào "gói ứng dụng" của ứng dụng trong thư mục Tài nguyên. Có rất nhiều cách để đào chúng ra.

Một cách phổ biến là để có được tên đường dẫn của một tập tin trong nhóm của mình:

NSBundle *mainBundle = [NSBundle mainBundle]; 
NSString *myFile = [mainBundle pathForResource: @"data" ofType: @"bin"]; 

Nếu bạn có các file khác ở những nơi không chuẩn trong nhóm của mình, có những khác biệt để pathForResource cho phép chỉ định của bạn một Tên thư mục.

Nếu bạn muốn xem vị trí thực tế trên ổ cứng của bạn rằng trình mô phỏng đang sử dụng, do đó bạn có thể kiểm tra nó, bạn có thể nói:

NSLog(@"Main bundle path: %@", mainBundle); 
NSLog(@"myFile path: %@", myFile); 

Tìm kiếm "Hướng dẫn lập trình Bundle" trong Xcode thư viện tài liệu để bắt đầu. :-)

+0

Nếu bạn gặp lỗi khi sử dụng mã ở trên (như lấy lại nil cho myFile), hãy tìm gói ứng dụng của bạn trong thư mục xây dựng của Xcode, nhấp chuột phải vào nó (xem nội dung của nó) và xem liệu Xcode ** có thực sự đặt dữ liệu không .bin "tập tin ở đó. :-) –

+0

thực sự nó đã cho tôi nil trở lại cho' pathForResource' Tôi đã xóa tất cả Tài nguyên của tôi và thêm chúng trở lại từ đầu. cách tốt nhất để thêm nhóm là gì? sao tôi phải bấm vào dự án và làm 'Thêm tệp vào ?' – chizzle

+0

Bạn chỉ có thể sử dụng nút" + "trong phần" Sao chép tài nguyên gói "của các cài đặt Xây dựng giai đoạn cho mục tiêu của bạn. Một lần nữa, nếu bạn muốn xem Xcode đang làm gì đằng sau hậu trường, hãy sử dụng Trình tìm kiếm để điều hướng đến thư mục '~/Library/Developer/Xcode/DerrivedData/{chữ thường ngẫu nhiên}}/Build/Products/Debug-iphonesimulator' và xem bên trong tệp ".app". Đó là gói của bạn và cần có các tệp mà bạn đã yêu cầu Xcode sao chép. –

1

Sử dụng NSBundle lớp học cho điều đó. Ví dụ:

NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"bin"]; 
NSInputStream *is = [[NSInputStream alloc] initWithFileAtPath:path]; 
... 
+1

Tôi nhận được *** Chấm dứt ứng dụng do ngoại lệ uncaught 'NSInvalidArgumentException', lý do: '*** - [NSURL initFileURLWithPath:]: tham số chuỗi nil' *** Đố cuộc gọi ném đầu tiên: – chizzle

0

Thực sự gọi [đang mở] là cần thiết ngay cả khi bạn "initialiseWithFileAtPath". Tôi nghĩ rằng initialisation sẽ tự động mở tập tin cho bạn, nhưng nó không.

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