@GSmaster

Возможно ли при распаковке архива указать свой разделитель директорий?

Собственно проблема в том что создаю архив на xp + php 5.3xx
архив создаётся правильно и разделитель в нём виндовый \

но затем заливаю на хост с cent os и он распаковывает с таким же разделителем (естественно навигация не работает) хотя по идее должен поменять на /

Может кто сталкивался с такой бедой? читал про флаги ZIPARCHIVE но так и не нашел.

// ------------------  Упаковка в архив папки   -------------------------------------------------//
function compress_dir ($from, $to, $postfix, $except) {
 $zip = new ZipArchive;
 if ($zip->open($from . '/' . $to . $postfix . '.zip', ZIPARCHIVE::CREATE) !== TRUE) die ("Could not create archive");
 
 $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator( $from ));
 
 foreach ($iterator as $path) {
   if (realpath($path) != realpath($from . "/" . $except))
     $zip->addFile(realpath($path), str_replace($from, "", $path)) or die ("ERROR: Could not add file: $path");
 }
 
 $zip->close();
 return "<b><font color=\"green\">Archive</font></b> " .
   $from . '/' . $to . $postfix . '.zip' . " <b><font color=\"green\">created</font></b> successfully <b>except</b> $except";
}
// ------------------------------------------------------------------------------------------------------//
 
 
      $zip = new ZipArchive;
  if ($zip->open($arc) === TRUE) {
   $zip->extractTo($arcPath . $uid . $arcDir . DIR_SEP);
   $zip->close();
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
@GSmaster Автор вопроса
Как-то так - пришлось писать самому
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';
}



?>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы