1 votes

J'ai besoin de copier uniquement les fichiers et dossiers sélectionnés en PHP

J'utilise le code suivant sous Windows OS et PHP script, dans lequel je prends d'abord la différence entre deux structures de dossiers et ensuite le résultat doit être copié dans un autre dossier. voici le code ci-dessous.

$source = '/var/www/html/copy1';
$mirror = '/var/www/html/copy2';
function scan_dir_recursive($dir, $rel = null) {

  $all_paths = array();
  $new_paths = scandir($dir);

  foreach ($new_paths as $path) {

    if ($path == '.' || $path == '..') {
      continue;
    }

    if ($rel === null) {
        $path_with_rel = $path;
    } else {
        $path_with_rel = $rel . DIRECTORY_SEPARATOR . $path;
    }

    $full_path = $dir . DIRECTORY_SEPARATOR . $path;
    $all_paths[] = $path_with_rel;

    if (is_dir($full_path)) {
      $all_paths = array_merge(
        $all_paths, scan_dir_recursive($full_path, $path_with_rel)
      );
    }

  }

  return $all_paths;

}
$diff_paths = array_diff(
    scan_dir_recursive($mirror),
    scan_dir_recursive($source)
);

/*$diff_path = array_diff($mirror,$original);*/
echo "<pre>Difference ";print_r($diff_paths);
    Difference of Folders Array
(
    [4] => New Folder (2)
    [5] => New Folder (2)/New Folder
    [6] => New Folder (2)/New Folder/New Folder
    [7] => New Folder (2)/New Folder/New Folder/New Text Document (2).txt
    [8] => New Folder (2)/New Folder/New Folder/New Text Document.txt
)

foreach($diff_paths as $path)
{
    echo $source1 = "var/www/html/copy2/".$path;
    echo "<br>";
    $des = "var/www/html/copy1/".$path;
    copy_recursive_dirs($source1, $des);
}

function copy_recursive_dirs($dirsource, $dirdest)
{ 
   $dir_handle=opendir($dirsource);

    mkdir($dirdest,0777);

 while(false!==($file=readdir($dir_handle)))
 {/*echo "<pre>";
  print_r($file);*/
     if($file!="." && $file!="..")
     {
         if(is_dir($dirsource.DIRECTORY_SEPARATOR.$file)) 
         {
            //Copy the file at the same level in the destination folder
            copy_recursive_dirs($dirsource.DIRECTORY_SEPARATOR.$file, $dirdest.DIRECTORY_SEPARATOR.$file);

         }
         else{
            //Copy the dir at the same lavel in the destination folder
             copy ($dirsource.DIRECTORY_SEPARATOR.$file, $dirdest.DIRECTORY_SEPARATOR.$file);

         }
     }
  }
 closedir($dir_handle);
 return true;
}

Chaque fois que j'exécute le script, j'obtiens la différence de sortie mais je n'obtiens pas l'autre copie dans le deuxième dossier comme le prévoit le code.... Merci de m'aider à rectifier...

MISE À JOUR Je veux juste copier la différence dans dans un autre dossier, s'il y a un autre moyen moyen, merci de m'aider....

UPDATE : Je reçois ces erreurs,

( ! ) Avertissement : opendir(var/www/html/copy2/Nouveau dossier (2)) [function.opendir] : failed to ouvrir le répertoire : No such file or directory in /var/www/html/pranav_test/syncss.php à la ligne 96

( ! ) Attention : mkdir() [function.mkdir] : Aucun fichier ou répertoire répertoire dans /var/www/html/pranav_test/syncss.php à la ligne 99

( ! ) Avertissement : readdir() : l'argument fourni n'est pas n'est pas un répertoire valide dans /var/www/html/pranav_test/syncss.php à la ligne 104

( ! ) Attention : closedir() : l'argument fourni n'est pas un répertoire valide. n'est pas un répertoire valide valide dans /var/www/html/pranav_test/syncss.php à la ligne 122

1voto

N'essayez pas de tout faire en même temps.
Séparez votre tâche en plusieurs parties.
Et ne passez à la partie suivante que si vous avez terminé et testé la partie précédente.

Tout d'abord, apprenez à trouver la différence entre deux tableaux :
Codez en dur 2 tableaux légèrement différents dans votre script et jouez avec array_diff() fonction

Ensuite, apprenez à lire des fichiers à partir d'un répertoire. Pas de récursivité, un seul.
On obtient un tableau de noms de fichiers.
Testez-le avec print_r()

Vous pouvez maintenant essayer de lire deux répertoires dans des tableaux et de les comparer.
S'il ne fonctionne toujours pas, le déboguer Les tableaux : imprimez le contenu des tableaux et comparez-les avec vos yeux. Demandez de l'aide sur SO pour ce problème particulier et certain avec des données d'entrée simples et claires. Le résultat est un tableau de différences, imprimé sur l'écran pour s'assurer qu'il contient des données réelles.

Vous pouvez maintenant passer à la partie copie. Même technique.

Vous pouvez ensuite opter pour des répertoires récursifs. Même technique - double vérification et test à chaque étape. Imprimez autant d'informations de débogage que possible.

Activez les rapports d'erreur et assurez-vous que vous pouvez voir toutes les erreurs qui se sont produites (faites-en une intentionnellement et voyez). tous l'opération sur le système de fichiers génère une erreur en cas d'échec. Vous en verrez donc la raison. Et déboguer les opérations du système de fichiers également. Imprimez les conditions pour voir si elles ont été exécutées. Imprimer le contenu des variables, les valeurs de retour des fonctions.

Vous vous êtes déjà demandé ce que c'était que ce $dirsource.DIRECTORY_SEPARATOR.$file de la ligne réel valeur ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X