2012-08-27 18 views
8

Tôi đang lưu vào bộ nhớ cache một số Thông tin Người dùng trong hệ thống tệp. Và sau đó đọc sử dụngAccessDate của tệp không bị thay đổi sau khi đọc Tệp theo [Dữ liệu NSDataWithContentsOfURL: ...]

NSData *cachedMessagesData = [NSData dataWithContentsOfURL:fileDirectoryForUserInfoCache]; 

Tôi cần phải biết thời gian truy cập của mỗi tập tin lưu trữ, tuy nhiên, khi tôi kiểm tra thời gian truy cập bằng cách sử dụng chính tài sản:

NSArray *filesInUserInfoCacheDirectory = [self.fileManager contentsOfDirectoryAtURL:self.cacheDirectoryForUserInfo includingPropertiesForKeys:[NSArray arrayWithObjects:@"NSURLCreationDateKey", @"NSURLContentAccessDateKey", nil] options:NSDirectoryEnumerationSkipsHiddenFiles error:nil]; 

NSDate *accessDate = [[[filesInUserInfoCacheDirectory lastObject] resourceValuesForKeys:[NSArray arrayWithObject:@"NSURLContentAccessDateKey"] error:nil] objectForKey:@"NSURLContentAccessDateKey"]; 

tôi thấy rằng ngày truy cập là giống như ngày tạo tệp. Đọc tệp thông qua [NSData dataWithContentOfURL: ...] sẽ không thay đổi thuộc tính thời gian truy cập của tệp.

Có ai vui lòng cho tôi biết lý do không? Có cách nào để đọc tệp để cập nhật thời gian truy cập không? Cảm ơn rất nhiều trước.

Trả lời

7

Trả lời câu hỏi của riêng tôi. Tôi cuối cùng đã phải làm việc xung quanh một chút. Không thể cập nhật thuộc tính ngày của tệp NSURL sau khi đọc tệp, ngày của nó luôn giống như ngày tạo tệp NSURL. Một cách để làm việc xung quanh là ghi đè lên tập tin mỗi lần sau khi đọc, sau đó ngày truy cập được cập nhật. Nhưng điều này nghe có vẻ kỳ lạ với tôi.

Cách khác là sử dụng thuộc tính Ngày sửa đổi của tệp NSURL thay thế. Thuộc tính này có thể được thiết lập bởi FileManager's API setAttributes: ofItemAtPath:. Thay vì thực sự sửa đổi tệp, tôi đặt thuộc tính ngày sửa đổi mỗi lần sau khi đọc tệp. Và sau đó đọc lại đối tượng NSDate này bằng tài nguyên API NSURLValuesForKeys: sau này.

[self.fileManager setAttributes:[NSDictionary dictionaryWithObject:[NSDate date] forKey:NSFileModificationDate] ofItemAtPath:[fileDirectoryForUserInfoCache path] error:nil];