Reading the bytes from a text file using a dispatch I/O channel

- (void)readContentsOfFile:(NSURL*)anURL {
     // Open the channel for reading.
     NSString*   filePath = [anURL path];
     self.channel = dispatch_io_create_with_path(DISPATCH_IO_RANDOM,
                      // Convert to C-string
                      // Open for reading
                      // No extra flags
   dispatch_release(self.channel);
   self.channel = nil;
}
[filePath UTF8String],
O_RDONLY,
0,
dispatch_get_main_queue(),
^(int error){
// Cleanup code
if (error == 0) {
});
   // If the file channel could not be created, just abort.
   if (!self.channel)
return;
    // Get the file size.
    NSNumber* theSize;
    NSInteger fileSize = 0;
    if ([anURL getResourceValue:&theSize forKey:NSURLFileSizeKey error:nil])
        fileSize = [theSize integerValue];
   // Break the file into 1024 size strings.
   size_t chunkSize = 1024;
   off_t  currentOffset = 0;
   for (currentOffset = 0; currentOffset < fileSize; currentOffset += chunkSize)
{
      dispatch_io_read(self.channel, currentOffset, chunkSize,
dispatch_get_main_queue(),
                     ^(bool done, dispatch_data_t data, int error){
                        if (error)
                           return;
                        // Build strings from the data.
                        dispatch_data_apply(data,
  (dispatch_data_applier_t)^(dispatch_data_t region,
 size_t size){
init];
initWithBytes:buffer
                          size_t offset, const void *buffer,
      NSAutoreleasePool* pool = [[NSAutoreleasePool alloc]
      NSString* aString = [[[NSString alloc]
                  length:size encoding:NSUTF8StringEncoding]
[self addString:aString toFile:anURL]; // Custom method. [pool release];
return true; // Keep processing if there is more data. });
});
autorelease];
} }

發佈了264 篇原創文章 · 獲贊 3 · 訪問量 34萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章