2012-04-15 3 views
0

Ich möchte die ersten 8 Bytes oder so einer Datei erhalten, ohne die ganze Datei zu lesen. Ich benutze NSData, um mit den Daten und so weiter zu arbeiten, aber ich möchte meine Anwendung nicht mit exzessiven Lese- und Schreiboperationen verlangsamen, da ich in manchen Fällen eine 200-Kilobyte-Datei lesen muss, um die ersten 2 zu extrahieren Bytes von Daten aus der Datei. Gibt es eine Möglichkeit, nur einen Teil der Datei zu lesen oder zu schreiben, ohne das ganze in Xcode mit dem iOS SDK zu lesen oder zu überschreiben?Partielle Datei lesen und schreiben mit iOS SDK

Das Dateisystem, das ich verwende, ist nur der Standard, der über die NSFileManager-Klasse zugänglich ist (ich kenne kein anderes iOS-Dateisystem).

+0

können Sie C verwenden, um die Datei zu öffnen und die ersten beiden Bytes lesen, wenn Sie c wissen, oder Sie können bei dataWithBytes aussehen: Länge: Methode der NSData –

+1

Methode von Jody Hagins funktioniert nicht für mich. Versuchen Sie das - [es funktioniert gut] (http://stackoverflow.com/a/1416029/2421234) –

Antwort

3

Verwenden Sie die standardmäßige C-Datei-API (entweder FILE * oder int-Dateideskriptoren). Der Nachteil ist, dass Sie den String-Pfad korrekt in einen korrekten char * -Dateipfad konvertieren müssen. Vergessen Sie außerdem nicht, die Datei zu schließen, wenn Sie fertig sind. Betrachten Sie eine Kategorie auf NSData, etwas irgendwie so ...

+ (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

Sie Vorteil der höheren Ebene NSFileHandle Klasse in Anspruch nehmen. Die Klasse NSFileHandle ist ein objektorientierter Wrapper für einen Dateideskriptor. Sie verwenden Dateizugriffsobjekte, um auf Daten zuzugreifen, die mit Dateien, Sockets, Pipes und Geräten verknüpft sind. Bei Dateien können Sie innerhalb der Datei lesen, schreiben und suchen. Für Sockets, Pipes und Geräte können Sie ein Datei-Handle-Objekt verwenden, um das Gerät zu überwachen und Daten asynchron zu verarbeiten.

- (NSData *)readDataOfLength:(NSUInteger)length 

Sie finden weitere Informationen in der offiziellen Dokumentation erhalten NSFileHandle Class Reference

+0

Ich mag diese Lösung besser, weil es eine höhere Klasse verwendet, wie Sie gesagt haben. Vielen Dank. –