Bonjour à tous.
Pour la petite histoire, j'ai fait une fonction, ce qu'il y a de plus classique, de suppression recursive de dossier, à savoir:
Pour une utilisation normale tout fonctionne très bien. Par contre, pour une raison inconnu, cela plante de temps en temps (1 fois sur 20 environ) lorsque le dossier est pointé via un lien symbolique (testé avec un lien symbolique windows (mklink /D, ici C:\www\temp)):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public function recursiveRemoveDir($dir) { $dir = realpath($dir); if(is_dir($dir)) { $scan = scandir($dir); $files = array_diff($scan, array('.','..')); foreach ($files as $file) { if(is_dir("$dir/$file")){ $this->recursiveRemoveDir("$dir/$file"); } elseif(file_exists("$dir/$file")) { unlink("$dir/$file"); } } rmdir($dir); } }
Une fois arrivé au bout de la fonction, il refuse de supprimer le dossier courant (via rmdir, ligne 18), car il n'est, soit disant, pas vide.
Alors, là déjà WTF !??
Du coup, pour tester j'ai essayé d'être un peu bourrin et de rajouter une partie de vérification à la fin de la fonction, qui ré-executerai la boucle de suppression dans le cas ou le dossier serrait concidéré comme non-vide:
Malgrès cela, de temps à autre, j'ai tout de même une erreur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 public function recursiveRemoveDir($dir, $tries=3) { if($tries > 0){ $dir = realpath($dir); if(is_dir($dir)) { $scan = scandir($dir); $files = array_diff($scan, array('.','..')); foreach ($files as $file) { if(is_dir("$dir/$file")){ $this->recursiveRemoveDir("$dir/$file"); } elseif(file_exists("$dir/$file")) { unlink("$dir/$file"); } } /* PARTIE VERIFICATION */ $scan = scandir($dir); $test = array_diff($scan, array('.','..')); if(count($test)==0) { rmdir($dir); } else { var_dump("dafuk"); echo "<br/>"; var_dump($dir); echo "<br/>"; var_dump($test); echo "<br/>"; $this->recursiveRemoveDir($dir, $tries-1); } return; /* FIN DE VERIFICATION */ } } else { /* THROW EXCEPTION SI TOUTEFOIS LA VERIFICATION N'AURAIT PAS FONCTIONNEE */ try { //dernière tentative désespérée de suppression rmdir($dir); } catch(FileException $e) { echo $e->getMessage(); } return; } }:
(correspondant aux var_dump de ma fonction, et du try()catch() final)
Alors, j'avoue que là... Mise à part un bug général de PHP (un delay entre le "return true" de mkdir et la suppression physique du dossier peut-être ??) Je n'ai aucune idée d'ou cela peut venir, ni comment régler le problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 string(5) "dafuk" string(63) "C:\www\temp\47cv6v2llakg4wkwg4ookoscgc044gc" array(1) { [2]=> string(12) "twentytwelve" } string(5) "dafuk" string(63) "C:\www\temp\47cv6v2llakg4wkwg4ookoscgc044gc" array(1) { [2]=> string(12) "twentytwelve" } string(5) "dafuk" string(63) "C:\www\temp\47cv6v2llakg4wkwg4ookoscgc044gc" array(1) { [2]=> string(12) "twentytwelve" } Warning: rmdir(www\temp\47cv6v2llakg4wkwg4ookoscgc044gc): Directory not empty in C:\www\function\ListDirectoryFiles.php on line 191
Des pistes ?
Merci beaucoup.
PS: Ah! et pour information, le dossier est pourtant bien vide lorsque je vais vérifier dedans après coup, donc en gros le script plante vraiment pour rien![]()
Partager