2012-02-27 28 views
18

Hãy xem xét hai mẫu đoạn mã sau:Tại sao lại sử dụng NSFileManager thay vì chỉ sử dụng phương thức writeToFile của NSData: phương pháp: khi tạo một tệp mới?

NSData *imgData = UIImagePNGRepresentation(imgFull); 
    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path 
    [imgData writeToFile:fullPath atomically:YES]; 

NSData *imgData = UIImagePNGRepresentation(imgFull); 
NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"itemImg_%i.png", timestamp]]; //add our image to the path 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
[fileManager createFileAtPath:fullPath contents:imgData attributes:nil]; 

Ví dụ thứ hai đòi hỏi thêm một dòng mã và khởi tạo của một đối tượng NSFileManager, trong khi ví dụ đầu tiên chỉ đơn giản là có đối tượng NSData imgData tự ghi vào một tệp. Một lợi thế bổ sung của ví dụ đầu tiên là nó có thể ghi đè lên một tệp đã tồn tại từ trước có cùng tên.

Câu hỏi của tôi là: khi tạo tệp mới, trong trường hợp nào bạn thực sự muốn sử dụng NSFileManager và phương thức của nó createFileAtPath:contents:attributes:?

+0

WriteToFile của NSData không ghi đè như mặc định, từ trải nghiệm của tôi. Và cũng không phải của hàm createFileAtPath của NSFileManager với các thuộc tính: nil.Thông tin về các thuộc tính NSDictionary phương pháp là sắp tới, cho thấy rằng nó không thường được sử dụng. –

Trả lời

35

Ưu điểm của phương pháp NSFileManagerattributes lĩnh vực:

Một từ điển chứa các thuộc tính liên kết với các tập tin mới. Bạn có thể sử dụng các thuộc tính này để đặt số chủ sở hữu và nhóm, quyền đối với tệp và ngày sửa đổi. Để biết danh sách các phím, hãy xem “File Attribute Keys.” Nếu bạn chỉ định nil cho các thuộc tính, tập tin sẽ được tạo với một tập các thuộc tính mặc định.

Tính năng này không bình thường khi sử dụng trên iOS, nhưng NSFileManager cũ hơn iOS nhiều.

BTW, dòng bổ sung mà bạn mô tả gần như không bao giờ xuất hiện trong mã thực. Hoặc là bạn đã có một biến fileManager rằng bạn đang sử dụng vì lý do khác, hoặc bạn kết hợp hai dòng thành một:

[[NSFileManager defaultManager] createFileAtPath:fullPath contents:imgData attributes:nil]; 

Và chỉ cần thêm một. Như bạn lưu ý:

Một lợi thế nữa của ví dụ đầu tiên là nó có thể ghi đè lên tệp đã tồn tại có cùng tên.

Vâng, đó là lợi thế hoặc bất lợi tùy thuộc vào những gì bạn muốn. Nếu bạn có nghĩa là "tạo tập tin này, nhưng đừng ghi đè lên nó nếu nó đã tồn tại," thì phương pháp FM thuận tiện hơn nhiều. Có thể đó là lỗi để ghi đè tệp hiện có; thao tác này sẽ giúp bạn gọi đến số fileExistsAtPath:. Có thể bạn muốn tạo một tệp trống nếu nó không có ở đó, nhưng để nó một mình nếu nó có. Đơn giản: chuyển [NSData data] làm giá trị contents.

Vì vậy, điều tốt hơn phụ thuộc vào vấn đề bạn đang giải quyết.

+0

Câu trả lời tuyệt vời và cảm ơn bạn đã chạm vào một thời gian ngắn trên phiên bản rộng hơn, không phải iOS của lớp NSFileManager. – maxedison

+0

Câu trả lời tuyệt vời thực sự. Cảm ơn Rob – Eugene

+0

dưới SandBox, nó nhận được nhiều hơn trong khác nhau. Hope Rob có thể nâng cấp câu trả lời. Cảm ơn! –

0

theo kiến ​​thức của tôi và sau khi đọc câu trả lời của Rob, Hầu hết các thao tác tệp có thể được thực hiện bằng cách sử dụng đối tượng trình quản lý tệp được chia sẻ. bởi vì mỗi con đường tạo ra chỉ một lần. Do đó không thể phát sinh tình trạng ghi đè.Vui lòng sửa nếu tôi sai.

0

Gần đây, tôi thấy rằng writeToFile:atomically: không phù hợp khi đơn vị kiểm tra mã. Để thực hiện kiểm tra thoải mái, tôi đã phải tiêm NSFileManager vào lớp và trong bài kiểm tra tôi đã sử dụng trình quản lý tệp giả mạo để xác minh hành vi.

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