ОсновноеRadiotalkПользовательское
Программирование
6   •   Посмотреть все темы

Вопросы из области php

 

7094
Dim @Render
TheDark, по rename, скорее всего виндузятенские политики безопасности по правам на изменение файлов или папок.
Попробуй потестить rename на любом нормальном хостинге.

0
1555
Алексей @TheDark
Render, допустим... но почему лишь некоторые папки так блокируются? прямо скажем, всего одна) права и настройки безопасности у нее такие же как и у всех)

0
7094
Dim @Render
TheDark пишет:

Render, допустим... но почему лишь некоторые папки так блокируются? прямо скажем, всего одна) права и настройки безопасности у нее такие же как и у всех)

В свойствах её не стоит случаем "только чтение"?

0
1555
Алексей @TheDark
Render, нет, галочка снята)

0
1555
Алексей @TheDark
Ребят, нужна помощь всех, кому не лень. Все пилю свой файловый менеджер и решаю вопрос с удалением папок.
rmdir() не работает, если папка не пуста. А они в основном не пустые.
Попытался написать функцию рекурсивного удаления, чтоб сначала удалить все файлы, а затем и папку:
  1. function delete_folder($this_dir) {
  2. // перебираем папку
  3. $file = scandir($this_dir);
  4. foreach($file as $object) {
  5. if($object != '.' && $object != '..') {
  6. //если файл - удаляем
  7. if(is_file($this_dir.'/'.$object)) {
  8. unlink($this_dir.'/'.$object);
  9. }
  10. else {
  11. //если папка, то проверяем ее
  12. if(is_dir($this_dir.'/'.$object)) {
  13. //если пустая - удаляем
  14. if(count(scandir($this_dir.'/'.$object)) < 3) {
  15. rmdir($this_dir.'/'.$object);
  16. }
  17. //если нет - рекурсия
  18. else {
  19. return delete_folder($this_dir.'/'.$object);
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }

Но работает не так как ожидается.
Это трудно объяснить словами, просто создайте простое дерево папок с файлами, протестируйте этот код и все поймете. $this_dir = полный путь к файлу.
Нужно как-то научить функцию возвращаться на одну папку вверх, чтоб удалить вложенную папку, если та пуста, а заодно проверить и все остальные вложенные каталоги (т.к. сейчас проверяется только первая вложенная директория).

Помогите, пожалуйста 🙁

Отредактировано TheDark - 09.09.2014
0
2615
Сергей @Pegass
TheDark пишет:

Ребят, нужна помощь всех, кому не лень. Все пилю свой файловый менеджер и решаю вопрос с удалением папок.
rmdir() не работает, если папка не пуста. А они в основном не пустые.
Попытался написать функцию рекурсивного удаления, чтоб сначала удалить все файлы, а затем и папку:
  1. function delete_folder($this_dir) {
  2. // перебираем папку
  3. $file = scandir($this_dir);
  4. foreach($file as $object) {
  5. if($object != '.' && $object != '..') {
  6. //если файл - удаляем
  7. if(is_file($this_dir.'/'.$object)) {
  8. unlink($this_dir.'/'.$object);
  9. }
  10. else {
  11. //если папка, то проверяем ее
  12. if(is_dir($this_dir.'/'.$object)) {
  13. //если пустая - удаляем
  14. if(count(scandir($this_dir.'/'.$object)) < 3) {
  15. rmdir($this_dir.'/'.$object);
  16. }
  17. //если нет - рекурсия
  18. else {
  19. return delete_folder($this_dir.'/'.$object);
  20. }
  21. }
  22. }
  23. }
  24. }
  25. }

Но работает не так как ожидается.
Это трудно объяснить словами, просто создайте простое дерево папок с файлами, протестируйте этот код и все поймете. $this_dir = полный путь к файлу.
Нужно как-то научить функцию возвращаться на одну папку вверх, чтоб удалить вложенную папку, если та пуста, а заодно проверить и все остальные вложенные каталоги (т.к. сейчас проверяется только первая вложенная директория).

Помогите, пожалуйста 🙁

Это ж древняя как мир задача)))

  1. <?php
  2. function rm_dir($dir)
  3. {
  4. rmdir($dir);
  5. if(file_exists($dir))
  6. {
  7. $f = scandir($dir);
  8. $cf = count($content);
  9. for($i = '2'; $i < $cf; $i++)
  10. {
  11. $this_file = $f[$i];
  12. $path = "$dir$this_file ";
  13. if(!is_dir($path))
  14. {
  15. unlink($path);
  16. }
  17. else
  18. {
  19. $subdir = "$path/";
  20. rm_dir($subdir);
  21. }
  22. }
  23. rmdir($subdir);
  24. }
  25. if(!file_exists($dir)) return true; else return false;
  26. }
  27. ?>

Отредактировано Pegass - 09.09.2014
0
1555
Алексей @TheDark
Pegass, неа, не пашет. С пустой папкой справляется (как, в общем, и мой код), а если она не пустая, то возвращает Directory not empty...

0
2615
Сергей @Pegass
TheDark пишет:

Pegass, неа, не пашет. С пустой папкой справляется (как, в общем, и мой код), а если она не пустая, то возвращает Directory not empty...

путь к удаляемой папке должен оканчиваться на /

<?
rm_dir('/var/www/')
?>

Отредактировано Pegass - 09.09.2014
0
1555
Алексей @TheDark
Pegass, это понятно) функция получает такой путь (пока на локалке):
  1. $_SERVER['DOCUMENT_ROOT'].'/'.$_GET['folder'];

где $_GET['folder'] - folder/
и ошибка.

Отредактировано TheDark - 09.09.2014
0
2615
Сергей @Pegass
TheDark пишет:

где $_GET['folder'] - folder/

что-то я сомневаюсь))) выведи его на экран себе

0
1555
Алексей @TheDark
Pegass, ну я ж не дурака валяю))
Ошибка:
  1. Warning: rmdir(Z:/home/project.my/www/folder/) [function.rmdir]: Directory not empty

0
2615
Сергей @Pegass
  1. <?php
  2. function rm_dir($dir)
  3. {
  4. @rmdir($dir);
  5. if(file_exists($dir))
  6. {
  7. $f = scandir($dir);
  8. $cf = count($f);
  9. for($i = '2'; $i < $cf; $i++)
  10. {
  11. $this_file = $f[$i];
  12. $path = $dir."/".$this_file;
  13. if(!is_dir($path))
  14. {
  15. unlink($path);
  16. }
  17. else
  18. {
  19. rm_dir($path);
  20. }
  21. }
  22. rmdir($dir);
  23. }
  24. if(!file_exists($dir)) return true; else return false;
  25. }
  26. echo rm_dir($_SERVER['DOCUMENT_ROOT'].'/'.$_GET['folder']);
  27. ?>

Отредактировано Pegass - 10.09.2014
0
7094
Dim @Render
Гуглится на раз всё это

0
1555
Алексей @TheDark
Pegass, все отлично работает) спасибо) добавил @ к rmdir()
Render, я вчера так нагуглил, что написал функцию, которая... удалила все файлы сайта, перемещаясь вверх по дереву... благо бэкап был)

0
6600
Александр @admiral
Бекап наше все!
Бекапь все, бекапь везде, бекапь всегда )

0
20090
Dimitry @Dimitry
folder=../../../

0
2615
Сергей @Pegass
Dimitry пишет:

folder=../../../

Злой ты, лучшеб объяснил человеку чего написал, а то ему ж чтоб узнать проверить придётся))))

0
20090
Dimitry @Dimitry
на ошибках лучше всего учиться ))

0
1555
Алексей @TheDark
Pegass, чуя подставу, даже не пытался пробовать.

0
20090
Dimitry @Dimitry
ну и зря, значит попробует любой другой

0





Согласие на обработку данных на нашем сайте

Продолжая просматривать страницу, вы соглашаетесь с использованием файлов «Cookie» и с Политикой конфиденциальности «Privacy».
Наверху или внизу страницы вы можете изменить валюту и язык по умолчанию. Английская версия сайта ещё находится в доработке и доступна не полностью.