Как-то так - пришлось писать самому
p.s. с такими разделителями работает и в win и в cent
<?php
error_reporting(E_ALL);
define('DIR_SEP', DIRECTORY_SEPARATOR);
define('ROOT_DIR', str_replace('\\', DIR_SEP, __DIR__)) ;
$zipFile = ROOT_DIR . DIR_SEP . 'zip.zip';
$extractDir = ROOT_DIR . DIR_SEP . 'unpack';
zipExtract($zipFile, $extractDir, $oldSep = '\\', $newSep = DIR_SEP);
function zipExtract ($zipFile, $extractDir, $oldSep, $newSep) { // что, куда, старый разделитель, новый разделитель
echo 'begin extract ' . $zipFile . ' to ' . $extractDir . '<br /><br />';
if ( file_exists($zipFile) )
{
$zip = zip_open($zipFile);
while ($zip_entry = zip_read($zip))
{
if ( !is_dir( $dir = dirname( str_replace($oldSep, $newSep, ($extractDir . zip_entry_name($zip_entry)))) )) // папка с правильным путем
mkdir($dir, 0777, true);
echo $dir . ' = dir<br /><br />';
$file = str_replace($oldSep, $newSep, ($extractDir . zip_entry_name($zip_entry))); // файл с правильным путем
echo $file . ' = file<br /><br />';
$fp = fopen($file, "w");
if (zip_entry_open($zip, $zip_entry, "r"))
{
$buf = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
fwrite($fp, $buf);
zip_entry_close($zip_entry);
fclose($fp);
}
}
zip_close($zip);
} else
echo 'extracted file ' . $zipFile . ' not found';
}
?>