2013-04-25 11 views
11

Esistono buoni esempi per eseguire la lettura/scrittura di file in blocchi con obiettivo c? Sono nuovo di API obiettivo-c e iPhone, ecco il codice di esempio che ho scritto. Ci sono modi migliori per farlo?Esempio di lettura/scrittura file con NSFileHandle

-(void) performFileOperation 
{ 
    @try { 

     NSFileHandle *inputFileHandle; 
     NSFileHandle *outputFileHandle; 

     //check whether the output file exist, if not create a new one. 
     NSFileManager *morphedFileManager; 

     outputFileManager = [NSFileManager defaultManager]; 

     if ([outputFileManager fileExistsAtPath: self.outputFilePath ] == NO) 
     { 
      NSLog (@"Output file does not exist, creating a new one"); 
      [outputFileManager createFileAtPath: self.outputFilePath 
             contents: nil 
             attributes: nil]; 
     } 

     NSData *inputDataBuffer; 

     inputFileHandle = [NSFileHandle fileHandleForReadingAtPath: self.inputFilePath]; 

     NSAssert(inputFileHandle != nil, @"Failed to open handle for input file"); 

     outputFileHandle = [NSFileHandle fileHandleForReadingAtPath: self.outputFilePath]; 

     NSAssert(outputFileHandle != nil, @"Failed to open handle for output file"); 

     @try{ 
      // seek to the start of the file 
      [inputFileHandle seekToFileOffset: 0]; 
      [outputFileHandle seekToFileOffset: 0]; 

      while((inputDataBuffer = [inputFileHandle readDataOfLength: 1024]) != nil) 
      { 
       [outputFileHandle writeData: [self.fileWrapper process: inputDataBuffer]]; 
      } 
     } 
     @catch (NSException *exception) { 
      @throw; 
     } 
     @finally { 
      [inputFileHandle closeFile]; 
      [outputFileHandle closeFile]; 
     }   
    } 
    @catch (NSException *exception) { 
     @throw; 
    } 
} 

ottengo la seguente eccezione durante il tentativo di scrivere:

Failed to process input buffer (*** -[NSConcreteFileHandle writeData:]: Bad file descriptor) 
+0

funziona? A prima vista sembra a posto. Forse potresti aumentare la dimensione del buffer a qualcosa come 65kB o qualsiasi altra cosa. –

+0

sembra che stavo usando fileHandleForReadingAtPath invece di fileHandleForWritingAtPath. – ssk

risposta

3

ha bisogno di cambiare outputFileHandle linea:

outputFileHandle = [NSFileHandle fileHandleForWritingAtPath: self.outputFilePath];