PHP - subdirectorio FTP recursivamente?
-
06-07-2019 - |
Pregunta
El siguiente código funciona tanto que puedo descargar el directorio de manera recursiva. Pero, quiero descargar los directorios dentro de este directorio. Entonces, cuando se conecta está en. Dentro de . directorio es un subdirectorio " En " ;. Quiero recuperar recursivamente los contenidos dentro del directorio In. Los nombres de los directorios cambiarán, por lo que no puedo especificar qué incluirá en el script ... ¿Alguien sabe cómo hacerlo?
ftp_sync ("./In/");
ftp_close($conn_id);
function ftp_sync ($dir) {
global $conn_id;
if ($dir != ".") {
if (ftp_chdir($conn_id, $dir) == false) {
echo ("Change Dir Failed: $dir<BR>\r\n");
return;
}
if (!(is_dir($dir)))
mkdir($dir);
chdir ($dir);
}
$contents = ftp_nlist($conn_id, "./In/");
foreach ($contents as $file) {
if ($file == '.' || $file == '..')
continue;
if (@ftp_chdir($conn_id, $file)) {
ftp_chdir ($conn_id, "..");
ftp_sync ($file);
}
else
ftp_get($conn_id, $file, $file, FTP_BINARY);
}
ftp_chdir ($conn_id, "..");
chdir ("..");
}
Solución
Podría usar la clase RecursiveDirectoryIterator
:
$ite=new RecursiveDirectoryIterator("/path/");
$bytestotal=0;
$nbfiles=0;
foreach (new RecursiveIteratorIterator($ite) as $filename=>$cur) {
$filesize=$cur->getSize();
$bytestotal+=$filesize;
$nbfiles++;
echo "$filename => $filesize\n";
}
Ejemplo robado de http://www.php.net/manual/ en / class.recursivedirectoryiterator.php , y acomódelo a su gusto.
Otros consejos
Puedes usar el siguiente código:
public static function download($local_dir, $remote_dir, $ftp_conn) {
if ($remote_dir != ".") {
if (ftp_chdir($ftp_conn, $remote_dir) == false) {
echo ("Change Dir Failed: $remote_dir \n");
return;
}
if ( !(is_dir($remote_dir)) ){
mkdir($remote_dir);
echo "-> Folder created: ".$remote_dir." \n";
}
chdir($remote_dir);
}
$contents = ftp_nlist($ftp_conn, ".");
foreach ($contents as $file) {
if ($file == '.' || $file == '..') continue;
if (@ftp_chdir($ftp_conn, $file)) {
ftp_chdir($ftp_conn, "..");
ftpmanager::download($local_dir."/".$file, $file, $ftp_conn);
}
else {
echo "----> path for local file: "."$local_dir/$file"." \n";
echo "----> path for remote file: ".$file." \n";
ftp_get($ftp_conn, "$local_dir/$file", "$file", FTP_BINARY);
echo "-> Downloaded file: ".$local_dir."/".$file." \n";
}
}
ftp_chdir($ftp_conn, "..");
chdir("..");
}
Simplemente inserte esta función estática en un objeto y llámela:
myobject::download( $sBackUpFullCurrentPath, '.', $rConnection );
Espero que esto te ayude a ti oa otros.