
 Sergey Vanyushin - 2015-11-04 13:32:09 - 
In reply to message 1 from Romain Bala// init iso image
    $iso = new \CISOFile;
    $iso->open($filename);
    $iso->ISOInit();
    
    // get descriptor
    $usedDesc = $this->iso->GetDescriptor(SUPPLEMENTARY_VOLUME_DESC);
    if(!$usedDesc) $usedDesc = $this->iso->GetDescriptor(PRIMARY_VOLUME_DESC);
    
    // get block size
    $isoBlockSize = $usedDesc->iBlockSize;
    
    // traverse directories and create files table
    $files_locations = array();
    $files_sizes = array();
    
    $directories = $usedDesc->LoadMPathTable($this->iso);
    foreach ($directories as $Directory) {
        $directory = $Directory->GetFullPath($directories, false);
        $directory = trim($directory, '/');
        if ($directory != '') {
            $directory .= '/';
        }
        $files = $Directory->LoadExtents($this->iso, $usedDesc->iBlockSize, true);
        if ($files) {
            foreach ($files as $file) {
                if (in_array($file->strd_FileId, array('.', '..'))) continue;
                $files_locations[$file->Location] = $directory.$file->strd_FileId;
                $files_sizes[$directory.$file->strd_FileId] = $file->DataLen;
            }
        }
    }
    
    // find file position in iso image
    //  for example, let's use filename "README.txt"
    $Location = array_search('README.txt', $files_locations);
    $Location_Real = $Location * $isoBlockSize;
    
    // seek file
    $iso->Seek($Location_Real, SEEK_SET);
    // read file
    $content = $iso->Read($files_sizes['README.txt']);