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

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

 

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

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

7094
Dim @Render
TheDark пишет:

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

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

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

1555
Алексей @TheDark
Ребят, нужна помощь всех, кому не лень. Все пилю свой файловый менеджер и решаю вопрос с удалением папок.
rmdir() не работает, если папка не пуста. А они в основном не пустые.
Попытался написать функцию рекурсивного удаления, чтоб сначала удалить все файлы, а затем и папку:
function delete_folder($this_dir) {
// перебираем папку
$file = scandir($this_dir);
foreach($file as $object) {
if($object != '.' && $object != '..') {
//если файл - удаляем
if(is_file($this_dir.'/'.$object)) {
unlink($this_dir.'/'.$object);
}
else {
//если папка, то проверяем ее
if(is_dir($this_dir.'/'.$object)) {
//если пустая - удаляем
if(count(scandir($this_dir.'/'.$object)) < 3) {
rmdir($this_dir.'/'.$object);
}
//если нет - рекурсия
else {
return delete_folder($this_dir.'/'.$object);
}
}
}
}
}
}

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

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

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

Ребят, нужна помощь всех, кому не лень. Все пилю свой файловый менеджер и решаю вопрос с удалением папок.
rmdir() не работает, если папка не пуста. А они в основном не пустые.
Попытался написать функцию рекурсивного удаления, чтоб сначала удалить все файлы, а затем и папку:
function delete_folder($this_dir) {
// перебираем папку
$file = scandir($this_dir);
foreach($file as $object) {
if($object != '.' && $object != '..') {
//если файл - удаляем
if(is_file($this_dir.'/'.$object)) {
unlink($this_dir.'/'.$object);
}
else {
//если папка, то проверяем ее
if(is_dir($this_dir.'/'.$object)) {
//если пустая - удаляем
if(count(scandir($this_dir.'/'.$object)) < 3) {
rmdir($this_dir.'/'.$object);
}
//если нет - рекурсия
else {
return delete_folder($this_dir.'/'.$object);
}
}
}
}
}
}

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

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

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

<?php
function rm_dir($dir)
{
rmdir($dir);
if(file_exists($dir))
{
$f = scandir($dir);
$cf = count($content);
for($i = '2'; $i < $cf; $i++)
{
$this_file = $f[$i];
$path = "$dir$this_file ";
if(!is_dir($path))
{
unlink($path);
}
else
{
$subdir = "$path/";
rm_dir($subdir);
}
}
rmdir($subdir);
}
if(!file_exists($dir)) return true; else return false;
}
?>

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

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

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

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

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

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

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

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

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

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

2615
Сергей @Pegass
<?php
function rm_dir($dir)
{
@rmdir($dir);
if(file_exists($dir))
{
$f = scandir($dir);
$cf = count($f);
for($i = '2'; $i < $cf; $i++)
{
$this_file = $f[$i];
$path = $dir."/".$this_file;
if(!is_dir($path))
{
unlink($path);
}
else
{
rm_dir($path);
}
}
rmdir($dir);
}
if(!file_exists($dir)) return true; else return false;
}
echo rm_dir($_SERVER['DOCUMENT_ROOT'].'/'.$_GET['folder']);
?>

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

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

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

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

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

folder=../../../

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

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

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

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