2012-04-15 28 views
0

我想在不讀取整個文件的情況下獲取文件的前8個字節左右。我正在使用NSData來處理數據等,但我不想過多的文件讀寫操作來減慢我的應用程序,因爲在某些情況下,我不得不讀取一個200千字節的文件來提取前兩個文件來自文件的數據字節。有沒有什麼方法可以讀寫文件的一部分,而無需使用iOS SDK讀取或覆蓋Xcode中的所有內容?部分文件讀寫iOS SDK

我正在使用的文件系統只是可通過NSFileManager類(我不知道任何其他iOS文件系統)訪問的默認文件系統。

+0

您可以用C來打開文件並讀取前兩個字節,如果你知道C或你可以看看dataWithBytes:長度:NSData的 – 2012-04-15 19:28:18

+1

的方法Jody Hagins的方法不適合我。試試這個 - [它工作正常](http://stackoverflow.com/a/1416029/2421234) – 2014-01-20 06:43:19

回答

3

使用標準C文件API(FILE *或int文件描述符)。需要注意的是,您必須正確地將字符串路徑轉換爲正確的char *文件路徑。另外,不要忘記完成後關閉文件。考慮NSData的類別,東西還挺像這樣...

+ (id)dataWithContentsOfFile:(NSString *)filePath numBytes:(NSUInteger)numBytes 
{ 
    void *bytes = malloc(numBytes); 
    NSData *result = [NSData dataWithBytesNoCopy:bytes length:numBytes]; 
    char const *path = [[NSFileManager defaultManager] fileSystemRepresentationWithPath:filePath]; 
    int fd; 
    if ((fd = open(path, O_RDONLY)) < 0 || read(fd, bytes, numBytes) != numBytes) { 
     result = nil; 
    } 
    close(fd); 
    return result; 
} 
2

您可能需要更高級別的NSFileHandle類的優勢。 NSFileHandle類是文件描述符的面向對象的包裝器。您可以使用文件句柄對象來訪問與文件,套接字,管道和設備相關的數據。對於文件,您可以在文件中讀取,寫入和查找。對於套接字,管道和設備,可以使用文件句柄對象來監視設備並異步處理數據。

- (NSData *)readDataOfLength:(NSUInteger)length 

你可以得到正式文件的詳細信息NSFileHandle Class Reference

+0

我更喜歡這個解決方案,因爲它像你說的那樣利用更高級別的類。謝謝。 – 2013-06-18 02:02:06