2010-05-08 2 views
0

J'utilise PHP et je dois le script quelque chose comme ci-dessous:Supprimez les fichiers indésirables et les dossiers de dossier de destination par rapport au dossier source

Je dois comparer deux structure de dossiers et référence du dossier source Je voulez supprimer tous les fichiers/dossiers présent dans d'autres dossier de destination qui n'existent pas dans la source de référence dossier , comment pourrais-je faire cela?

ÉDITÉE:

$original = scan_dir_recursive('/var/www/html/copy2'); 
$mirror = scan_dir_recursive('/var/www/html/copy1'); 
function scan_dir_recursive($dir) { 

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

    foreach ($new_paths as $path) { 
    if ($path == '.' || $path == '..') { 
     continue; 
    } 
    $path = $dir . DIRECTORY_SEPARATOR . $path; 
    if (is_dir($path)) { 
     $all_paths = array_merge($all_paths, scan_dir_recursive($path)); 
    } else { 
     $all_paths[] = $path; 
    } 
    } 

    return $all_paths; 

} 
foreach($mirror as $mirr) 
{ 
    if($mirr != '.' && $mirr != '..') 
    { 
    if(!in_array($mirr, $original)) 
    { 
     unlink($mirr); 
     // delete the file 
    } 

    } 
} 

Le code ci-dessus montre ce que je l'ai fait .. ici Mon dossier copy1 contient des fichiers supplémentaires que les dossiers copy2 donc je besoin de ces fichiers supplémentaires à supprimer.

ÉDITÉ: sortie Ci-dessous donné est sont des tableaux de miroir d'origine et de la différence des deux ..

Original Array 
(
    [0] => /var/www/html/copy2/Copy (5) of New Text Document.txt 
    [1] => /var/www/html/copy2/Copy of New Text Document.txt 
) 

Mirror Array 
(
    [0] => /var/www/html/copy1/Copy (2) of New Text Document.txt 
    [1] => /var/www/html/copy1/Copy (3) of New Text Document.txt 
    [2] => /var/www/html/copy1/Copy (5) of New Text Document.txt 
) 

Difference Array 
(
    [0] => /var/www/html/copy1/Copy (2) of New Text Document.txt 
    [1] => /var/www/html/copy1/Copy (3) of New Text Document.txt 
    [2] => /var/www/html/copy1/Copy (5) of New Text Document.txt 
) 

quand j'itérer une boucle pour supprimer le tableau de différence tous les fichiers doit être supprimé selon la sortie affichée .. comment puis-je rectifier cela .. la boucle pour la suppression est donnée ci-dessous.

$dirs_to_delete = array(); 
foreach ($diff_path as $path) { 
    if (is_dir($path)) { 
     $dirs_to_delete[] = $path; 
    } else { 
     unlink($path); 
    } 
} 

while ($dir = array_pop($dirs_to_delete)) { 
    rmdir($dir); 
} 
+0

J'ai essayé d'expliquer ce qui allait mal dans mon commentaire. La nuit dernière, j'étais trop fatigué pour réparer ce que je savais qui allait mal tourner en premier lieu, désolé! Mon message est maintenant mis à jour avec une meilleure réponse. – erisco

Répondre

2

D'abord vous avez besoin d'une liste récursive des deux répertoires. Une fonction simple comme cela fonctionnera:

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; 

} 

Ensuite, vous pouvez calculer leur différence avec array_diff. En cours d'itération sur cette matrice, vous pourrez commencer à supprimer des fichiers. Les répertoires sont un peu plus compliqués car ils doivent d'abord être vides. J'ai testé des choses et ça devrait bien fonctionner maintenant. Bien sûr, ne me croyez pas sur parole. Assurez-vous de configurer votre propre test avant de supprimer des données réelles.

+0

Son ne fonctionne pas comme je le veux faire, je veux seulement les fichiers à supprimer du dossier miroir qui ne sont pas dans le dossier source, mais le code supprime tous les fichiers du dossier miroir ... pls help –

+0

votre miroir est '/ foo/bar/mirror' et votre source est'/baz/qux/source'. 'array_diff' va bien sûr voir tout comme différent. Soit découpez ces parties des chemins ou intégrez la fonctionnalité 'scan_dir_recursive' pour les exclure en premier lieu. – erisco

+0

J'ai changé 'scan_dir_recursive' pour agir plus comme' scandir' en ne poussant pas le répertoire initial sur chaque chemin. Vous devriez maintenant avoir un temps plus facile avec 'array_diff'. – erisco

0

Pour les répertoires récursifs s'il vous plaît utiliser:

$modified_directory = new RecursiveIteratorIterator(
     new RecursiveDirectoryIterator('path/to/modified'), true 
); 
$modified_files = array(); 
foreach ($modified_directory as $file) 
{ 
    $modified_files []= $file->getPathname(); 
} 

Vous pouvez faire d'autres choses comme $ file-> isDot(), ou $ file-> isFile(). Pour plus de commandes de fichiers avec SPLFileInfo visitez http://www.php.net/manual/en/class.splfileinfo.php

+0

+ 1 pour suggérer Spl – Gordon

+0

pls donner un exemple que d'autres ont donné je suis conscient du fait que spl aidera, peut fournir l'exemple @GORDON et @ Gorilla3D –

+0

@OMTheEternity l'exemple est juste là-haut. Utilisez le RecursiveDirectoryIterator. http://www.phpro.org/tutorials/Introduction-to-SPL.html – Gordon

-1

Commencez par faire un scandir() du dossier d'origine,
, puis exécutez un fichier scandir sur le dossier miroir.
commencez à parcourir le tableau de dossiers miroir et vérifiez si ce fichier est présent dans le fichier scandir() du dossier d'origine. quelque chose comme ça

 

$original = scandir('path/to/original/folder'); 
$mirror = scandir('path/to/mirror/folder'); 

foreach($mirror as $mirr) 
{ 
    if($mirr != '.' && $mirr != '..') 
    { 
    if(in_array($mirr, $original)) 
    { 
     // do not delete the file 
    } 
    else 
    { 
     // delete the file 
     unlink($mirr); 
    } 
    } 
} 
 

cela devrait résoudre votre problème.vous devrez modifier le code ci-dessus en conséquence (inclure une récursivité dans le code ci-dessus pour vérifier si le dossier que vous essayez de supprimer est vide ou non, s'il n'est pas vide, vous devrez d'abord supprimer tous les fichiers/dossiers dans celui-ci, puis supprimez le dossier parent).

+0

Ne fonctionne pas, il supprime tous mes fichiers ... –

+0

simplement copier et coller le code ne va pas aider complètement mon cher ami. Coller votre propre code ici d'abord, alors seulement un peut bien comprendre ce que vous essayez de faire. –

+0

Yaar gaurav J'essaie de faire cela depuis le matin et le code ur fait la même chose que de "erisco" Il supprime tous mes fichiers, j'ai seulement besoin de ces fichiers à supprimer du dossier miroir qui n'existe pas dans le dossier source –

0

Merci à tous pour le temps précieux donné à mon travail, spécial Merci à erisco pour son dévouement à mon problème, Below Code est le code parfait pour accomplir la tâche que je devais faire, avec un petit changement dans le dernier réponse éditée ...

$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) 
); 



echo "<pre>Difference ";print_r($diff_paths); 

$dirs_to_delete = array(); 
foreach ($diff_paths as $path) { 
    $path = $mirror."/".$path;//added code to unlink. 
    if (is_dir($path)) { 

     $dirs_to_delete[] = $path; 
    } else { 

     if(unlink($path)) 
     { 
      echo "File ".$path. "Deleted."; 
     } 
    } 
} 

while ($dir = array_pop($dirs_to_delete)) { 
    rmdir($dir); 
} 
Questions connexes