Класс обертки ZipArchive by Koenig

830
.
(\/)____o_O____(\/)
смысл такой, иногда надо запаковать в zip файлы и папки содержащие курилицу, чтоб не появлялись кракозябрики, данная обертка это исправляет
если хостинг нормальный и кирилица выводиться через фтп по русски, то ошибок быть не должно, писал для скрипта резервного копирования
сам класс
class Kzip {
    
private $zip;
   
public function __construct($archive) {
if (!extension_loaded('zip')) {
die('Unsupported Ziparchive class');
} 
$this->zip = new ZipArchive();
if (file_exists($archive)) {
$this->zip->open($archive) === true;    
} else {
$this->zip->open($archive, ZipArchive::CREATE) === true;        
}
}

public function extractTo($dir) {
$array = $this->getNames();
foreach ($array['cp'] as $k => $file) {    
$str = $this->zip->getFromName($file);
$pos = strrpos($array['utf'][$k], DIRECTORY_SEPARATOR);
$ee =  str_split($array['utf'][$k], $pos + 1);
if(!is_dir($dir . $ee[0])) {
mkdir($dir . $ee[0], 0777, true);
}
file_put_contents($dir . $array['utf'][$k], $str);
}
}

public function getNames() {
$names = array();    
for ($i = 0; $i < $this->zip->numFiles; $i++) {
$names['utf'][] = $this->fineName($this->zip->getNameIndex($i), 1);
$names['cp'][] = $this->zip->getNameIndex($i);
}
return $names;    
}

public function addFromDirecory($dir) {
$all = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
$files = array();
foreach ($all as $list) {
if ($list->isFile()) {
$files[] = $list->getPathname();  
}
}
foreach ($files as $file) {
$this->zip->addFile($file, $this->fineName($file));    
}
}

public function fineName($path, $mode = 0) {
return (!$mode) ? iconv('UTF-8', 'CP866//TRANSLIT//IGNORE', $path) : iconv('CP866', 'UTF-8//TRANSLIT//IGNORE', $path);
}

public function close() {
$this->zip->close();
}

}

в архиве примеры работы
Прикрепленные файлы:
.
(\/)____o_O____(\/)
пока предварительная версия, не оформлял и не рефакторил код, пару мест надо подправить
.
Koenig, $this->zip->open($archive) === true; - зачем это?
mkdir($dir . $ee[0], 0777, true); - зачем 777 права если каталог создается программно?
.
(\/)____o_O____(\/)
Delphinum, это велосипед, зипархив ломает имена папкам и файлам, папку создаем отдельно, туда и файл пишем, можно наверное 700 права попробовать, но думаю это не критично, === все по ману
.
(\/)____o_O____(\/)
Delphinum, да и я в самом начале написал что это пока сыро, уже чуть до делал, разровнял код, коменты добавил, рефакторинг провел не большой
.
Delphinum
Koenig, папке кошернее ставить права rwxrwxr-x
так и не монял зачем === true там, что это дает?
.
# Delphinum (04.11.2013 / 18:23)
Koenig, папке кошернее ставить права rwxrwxr-x
так и не монял зачем === true там, что это дает?
чесно говоря я тоже и не условие вроде
.
(\/)____o_O____(\/)
говорю же уже этого нет, рефакторинг
.
(\/)____o_O____(\/)
кто проверял?
.
Волнует вопрос - почему это там вообще было? ))
Всего: 34