
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']);