2015-02-20 11 views
11

Używając NSFileHandle, całkiem łatwo jest usunąć liczbę znaków n z końca pliku, używając polecenia truncateFileAtOffset.Nadpisywanie danych przy użyciu NSFileHandle

-(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle { 
    unsigned long long fileLength = [fileHandle seekToEndOfFile]; 
    [fileHandle truncateFileAtOffset:fileLength - numberOfCharacters]; 
} 

Jednak usuwanie znaków z przodu plik nie wydaje się możliwe bez konieczności kopiowania wszystkich pozostałych danych do pamięci, zastępując plik, a następnie pisemnie pozostałych danych z powrotem do pliku.

-(void)removeCharacters:(int)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle { 
    [fileHandle seekToFileOffset:numberOfCharacters]; 

    NSData *remainingData = [fileHandle readDataToEndOfFile]; 
    [fileHandle truncateFileAtOffset:0]; 
    [fileHandle writeData:remainingData]; 
} 

Ten kod działa, ale stanie się zobowiązaniem w przypadku dużych plików. czego mi brakuje?

Idealnie chciałabym móc zrobić replaceCharactersInRange: Withdata:

Odpowiedz

8

Po więcej zabawy z NSFileHandle stało się jasne, że wstawienie bez nadpisywania jest niemożliwe.

Jak wyjaśniono w: Inserting a string at a specified line in text file using objective cmożna tylko rosnąć plik na końcu, a nie w środku.”

Oto nieco bardziej zoptymalizowana wersja powyższego kodu:

-(void)removeCharacters:(unsigned long long)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle { 
    [fileHandle seekToFileOffset:numberOfCharacters]; 

    NSData *remainingData = [fileHandle readDataToEndOfFile]; 
    [fileHandle seekToFileOffset:0]; 
    [fileHandle writeData:remainingData]; 
    [fileHandle truncateFileAtOffset:remainingData.length]; 
} 

I bardziej zaangażowane rozwiązanie byłoby buforowanie pliku do innego pliku w porcjach. To zmniejszyłoby obawy związane z pamięcią.

+1

To jest dobre rozwiązanie. Sugerowałbym aktualizację sygnatury metody: - (void) removeCharacters: (unsigned long long) numberOfCharacters fromBeginningOfFile: (NSFileHandle *) fileHandle { – LMVogel