Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Usuwanie nie pustych katalogow
Forum PHP.pl > Forum > Przedszkole
Cr3dO
  1. function deleteDirectory ($path) {
  2. include_once('../../settings/FTP.php');
  3. $ftpConnection = ftp_connect($server, 21);
  4. ftp_login($ftpConnection, $user, $password);
  5. $result = @ftp_rmdir($ftpConnection, $path);
  6. ftp_close($ftpConnection);
  7. return $result;
  8. }


hej mam metodke jak widac powyzej i nie usuwa mi folderu jak zawiera inne foldery, dlaczego?
deirathe
BO folder nie jest pusty- sam sobie odpowiedziales... Nie mozna usuwac folderow wraz z zawartoscia, najpeirw usuwasz zawartosc a pozniej folder.
http://pl2.php.net/ftp_rmdir
tu masz funkcje delete recursive
Cr3dO
Cytat(deirathe @ 18.12.2009, 15:29:01 ) *
BO folder nie jest pusty- sam sobie odpowiedziales... Nie mozna usuwac folderow wraz z zawartoscia, najpeirw usuwasz zawartosc a pozniej folder.
http://pl2.php.net/ftp_rmdir
tu masz funkcje delete recursive


Nie da się tego obejść jakoś?

Mogę mieć np. zagnieżdzonych folderów z 30 i w każdym po 30 plików, usuwać najpierw wszystkie inne to trochę męczące
piotrekkr
Może zobacz tutaj na moją funkcję: http://piotrekkr.info/2009/08/czyszczenie-...ow-i-katalogow/
Cr3dO
Cytat(piotrekkr @ 18.12.2009, 17:01:19 ) *


Wnioskuje ze zmienna : $directory - to sciezka katalogu co ma byc usuniety

ale po co jest ta tablica? : $ommit
piotrekkr
tablica $ommit jest nieobowiązkowa możesz ją pominąć. Ona słyży do tego aby pominąć przy usuwaniu np. katalogi / pliki o określonej nazwie. Mi to było potrzebne bo chciałem wyrzucić wszystko z folderu tmp/ w projekcie ale że on był ściągnięty z svn to nie mogłem z niego usunąc folderu .svn/ bo svn w tmp/ przestanie działać smile.gif. Tak tylko jeszcze małą zmianę wprowadzę. Żeby usuwał też katalog główny (który podałeś w ścieżce).

  1. function directoryClean($directory, $ommit = array(), $removeSrcDir = false){
  2. $directory = rtrim($directory, DIRECTORY_SEPARATOR);
  3. $dirs = array($directory);
  4. $dirsToRemove = array();
  5. while (null !== ($dir = array_pop($dirs))) {
  6. $dh = opendir($dir);
  7. while ($file = readdir($dh)) {
  8. if ($file == '.' || $file == '..') {
  9. continue;
  10. }
  11. $filePath = $dir . DIRECTORY_SEPARATOR . $file;
  12. if (in_array($file, $ommit)) {
  13. $cantRemove[] = $filePath;
  14. continue;
  15. }
  16. if (is_dir($filePath)) {
  17. array_push($dirs, $filePath);
  18. if (!is_writeable($dir)) {
  19. $cantRemove[] = $filePath;
  20. }
  21. $dirsToRemove[] = $filePath;
  22. } else if (is_file($filePath) && is_writeable($dir)) {
  23. unlink($filePath);
  24. } else {
  25. $cantRemove[] = $filePath;
  26. }
  27. }
  28. closedir($dh);
  29. }
  30. $cantRemove = implode(':', $cantRemove);
  31. for($i = count($dirsToRemove) - 1; $i >= 0; $i--) {
  32. if (strpos($cantRemove, $dirsToRemove[$i]) === false) {
  33. rmdir($dirsToRemove[$i]);
  34. }
  35. }
  36. if($removeSrcDir && $cantRemove === ''){
  37. return rmdir(directory);
  38. }
  39. return true;
  40. }


Przetestuj czy wszystko działa bo na szybko dorobiłem końcówkę smile.gif.

Sposób użycia w twoim przypadku:

  1. directoryClean($sciazkaDoKatalogu, array(), true);
Cr3dO
Cytat(piotrekkr @ 18.12.2009, 18:14:30 ) *
tablica $ommit jest nieobowiązkowa możesz ją pominąć. Ona słyży do tego aby pominąć przy usuwaniu np. katalogi / pliki o określonej nazwie. Mi to było potrzebne bo chciałem wyrzucić wszystko z folderu tmp/ w projekcie ale że on był ściągnięty z svn to nie mogłem z niego usunąc folderu .svn/ bo svn w tmp/ przestanie działać smile.gif. Tak tylko jeszcze małą zmianę wprowadzę. Żeby usuwał też katalog główny (który podałeś w ścieżce).

  1. function directoryClean($directory, $ommit = array(), $removeSrcDir = false){
  2. $directory = rtrim($directory, DIRECTORY_SEPARATOR);
  3. $dirs = array($directory);
  4. $dirsToRemove = array();
  5. while (null !== ($dir = array_pop($dirs))) {
  6. $dh = opendir($dir);
  7. while ($file = readdir($dh)) {
  8. if ($file == '.' || $file == '..') {
  9. continue;
  10. }
  11. $filePath = $dir . DIRECTORY_SEPARATOR . $file;
  12. if (in_array($file, $ommit)) {
  13. $cantRemove[] = $filePath;
  14. continue;
  15. }
  16. if (is_dir($filePath)) {
  17. array_push($dirs, $filePath);
  18. if (!is_writeable($dir)) {
  19. $cantRemove[] = $filePath;
  20. }
  21. $dirsToRemove[] = $filePath;
  22. } else if (is_file($filePath) && is_writeable($dir)) {
  23. unlink($filePath);
  24. } else {
  25. $cantRemove[] = $filePath;
  26. }
  27. }
  28. closedir($dh);
  29. }
  30. $cantRemove = implode(':', $cantRemove);
  31. for($i = count($dirsToRemove) - 1; $i >= 0; $i--) {
  32. if (strpos($cantRemove, $dirsToRemove[$i]) === false) {
  33. rmdir($dirsToRemove[$i]);
  34. }
  35. }
  36. if($removeSrcDir && $cantRemove === ''){
  37. return rmdir(directory);
  38. }
  39. return true;
  40. }


Przetestuj czy wszystko działa bo na szybko dorobiłem końcówkę smile.gif.

Sposób użycia w twoim przypadku:

  1. directoryClean($sciazkaDoKatalogu, array(), true);



Niestety spóźniłeś się smile.gif

znalazłem to : http://forum.php.pl/index.php?showtopic=28...mp;#entry534029

działa super, mimo wszystko dzięki +
piotrekkr
Tak będzie działać super ale do czasu aż nie trafi na plik którego nie ma prawa usunąć a wtedy polecą warningi itd., no ale jeśli nie spodziewasz że takowe kiedykolwiek się pojawią w tym katalogu to będzie działać jak należy smile.gif. No i jest rekursywna więc im więcej katalogów do usunięcia tym więcej skrypt zajmuje pamięci na serwerze smile.gif No ale jak masz ich ze 30 to nie powinno być problemu smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.