[PHP] Cambiar nombre de zips de acuerdo al contenido
-
Hola !!!
Bueno, buscamos a alguien que pueda resolver este problema..
Tengo miles de archivos ZIP numerados del 0 al 17.000..
Dentro de cada archivo, se encuentra uno o dos archivos (a veces más pero no mas de 5).. En el caso de varios archivos, todos tienen nombres similares, solo cambian las ultimas letras.
Necesito un programa (no importa su lenguaje siempre y cuando funcione en Windows o con PHP mySQL) que le asigne a los ZIP numerados, el nombre del archivo que contiene DENTRO del zip..
Por ejemplo.. Un zip se llama 3465.zip y tiene un archivo llamado "Maldita Noche.mp3"
Yo necesito que convierta ese ZIP en "Maldita Noche.zip"
Esperamos sus respuestas ! -
Bueno, aquí hay un script que hace lo que necesitas. Utiliza la extension zip que bien con PHP, si no la tenes se puede descargar de http://snaps.php.net/win32/PECL_STABLE/php_zip.dll y debes copiarla al directorio extensions donde tienes instalado PHP.
Copia el script a un archivo php y reemplaza las constantes ZIP_DIR y ZIP_DIR_NUEVO por los directorios donde estan los zips y donde quieres que se renombren respectivamente.
El script va leyendo los archivos zips originales, luego lee el primer archivo dentro del zip, le saca la extension y utiliza el nombre para renombrar el archivo zip.
Dado que no das muchos datos sobre los archivos dentro del zip, asumi ciertas cosas (como que los archivos tiene extension).Edicion 1: Ahora reemplaza los puntos por espacios y transforma en mayuscula la primera letra de cada palabra. Lo de procesar números no correlativos ya lo hacia de antes porque lee los archivos zip existentes en el directorio especificado.Código PHP:define('ZIP_DIR','zips/');
define('ZIP_DIR_NUEVO','zipsNuevos/');
if(!dl('php_zip.dll')) die('Necesita la extension ZIP');
$zipDir = dir(ZIP_DIR);
while(false !==($zipArchivo = $zipDir->read()))
{
$zipDirArchivo = ZIP_DIR.$zipArchivo;
if('.zip'==substr($zipArchivo, -4) && is_file($zipDirArchivo))
{
$zip = zip_open($zipDirArchivo);
if($zip)
{
$zipEntradaNombre = basename(zip_entry_name(zip_read($zip)));
$zipEntradaExt = strrpos($zipEntradaNombre, '.');
$zipNuevoNombre = substr($zipEntradaNombre, 0, ($zipEntradaExt?$zipEntradaExt:strlen($zipEntradaNombre)));
$zipNuevoNombre = ucwords(str_replace('.', ' ', $zipNuevoNombre));
$zipNuevoNombreDir = ZIP_DIR_NUEVO.$zipNuevoNombre.'.zip';
zip_close($zip);
if(file_exists($zipNuevoNombreDir))
{
$i=0;
while(file_exists($zipNuevoNombreDir = ZIP_DIR_NUEVO.$zipNuevoNombre.'_'.$i.'.zip')) $i++;
}
echo (rename($zipDirArchivo, $zipNuevoNombreDir) ? 'Renombrado':'Error al renombrar').": $zipDirArchivo => $zipNuevoNombreDir\r\n";
}
}
}
$zipDir->close();
?>
Saludos -
Ktion:
Gracias por tu ayuda...
Te cuento, tengo un cd con efectos de sonido comprimidos en zip... las extensiones varian entre mp3, wma, y algunas mas, pasa que algunos zip tienen por ejemplo..
Efecto 1.mp3
Efecto 2.mp3
y asi... pero casi siempre el mismo nombre..
Por ultimo faltaria resolver el siguiente tema que creo que con la funcion de reemplazo de php se puede hacer.. que es Sacarle los puntos al nombre del archivo dentro del zip... Paso a dar el ejemplo de porque hay que hacer esto..
La gran mayoria No se llama simplemente "Super Efecto Lluvia.mp3", sinó que por algúna razón se llaman "super.efecto.lluvia.mp3"
Por ultimo, hay algunos numeros que no están, por lo que el script tendria que saltarlos...
Se podrían resolver estos dos últimos temas ??.
Mil gracias a todos por las respuestas y la colaboracion ! -
Lo acabo de probar y funciona perfecto... !!!
Lo que quedaría por resolver es el tema de que algunos zip tienen dentro de si, archivos con puntos en vez de espacios (una funcion de reemplazo).. Como el ejemplo que puse arriba..
Mil Gracias por tu ayuda !!!! -
y mira para el primer tema que decis, lo que se puede hacer es una vez que le sacas la extension al nombre del archivo que esta dentro del zip, agarrar esa sub-cadena y la volves a procesar, para que reemplaze todos los '. ' que encuentre por espacios en blanco
para hacer eso fijate si la funcion eregi_replace() te sirve, supuestamente busca una subcadena dentro de otra y cuando encuentra coincidencias , la reemplaza por lo que vos definas, pero la verdad no se si en la primera coincidencia para, o sigue hasta finalizar la cadena, nunca programe en php
eregi_replace("."," ", $cadena);
