PHP - удаление папки / файлов, только если там больше нет - PullRequest
1 голос
/ 17 августа 2011

$value может = структура папок для языкового файла. Пример: languages ​​/ english.php

$value также может = имя файла. Пример: english.php

Поэтому мне нужно получить текущую папку, в которой находится $value, и удалить ее ТОЛЬКО, если в этом каталоге нет других файлов / папок (после удаления самого файла, как я уже делаю, конечно).

foreach($module['languages'] as $lang => $langFile)
{
        foreach ($langFile as $type => $value)
        {
            @unlink($module_path . '/' . $value);
            // Now I need to delete the folder ONLY if there are no other directories inside the folder where it is currently at.
            // And ONLY if there are NO OTHER files within that folder also.
        }
}

Как я могу это сделать ?? И интересно, можно ли это сделать без использования цикла while, поскольку цикл while внутри цикла foreach может занять некоторое время, и нужно, чтобы это было как можно быстрее.

И только к вашему сведению, $ module_path никогда не должен быть удален. Так что если $value = english.php, он никогда не должен удалять $ module_path. Конечно, там всегда будет другой файл, поэтому проверка на это не обязательна, но не повредит в любом случае.

Спасибо, ребята:)

EDIT

Хорошо, теперь я использую этот код здесь, и он НЕ работает, он не удаляет папки или файлы, и я также не получаю никаких ошибок ... поэтому не уверен, в чем проблема:

foreach($module['languages'] as $lang => $langFile)
{
    foreach ($langFile as $type => $value)
    {
        if (@unlink($module_path . '/' . $value))
            @rmdir(dirname($module_path . '/' . $value));
    }
}

НИКОГДА, это работает ШАРМ !!! Ура всем !!

Ответы [ 4 ]

5 голосов
/ 17 августа 2011

Самый простой способ - это попробовать rmdir. Не удаляйте папку, если она не пуста

rmdir($module_path);

также вы можете проверить, является ли папка пустой по

if(count(glob($module_path.'*'))<3)//delete

2 для . и ..

UPD : как я уже писал, возможно, вам следует заменить $ module_path на dirname ($ module_path. '.'. $ Value);

1 голос
/ 17 августа 2011

Поскольку каталог, о котором вы заботитесь, может быть частью $value, вам нужно использовать dirname, чтобы выяснить, что такое родительский каталог, вы не можете просто предположить, что он $module_path.

$file_path = $module_path . '/' . $value;

if (@unlink($file_path)) {
    @rmdir(dirname($file_path));
}
0 голосов
/ 17 августа 2011

В приведенном ниже коде будет указан путь, проверьте, является ли он файлом (т. Е. Не каталогом).Если это файл, он извлекает имя каталога, затем удаляет файл, затем перебирает каталог и подсчитывает файлы в нем, если файлы равны нулю, он удаляет каталог.

Кодв качестве примера и должен работать, однако привилегии и настройка среды могут привести к тому, что он не будет работать.

<?php

if(!is_dir ( string $filename )){ //if it is a file
    $fileDir = dirname ( $filename );
    if ($handle = opendir($fileDir)) {
        echo "Directory handle: $handle\n";
        echo "Files:\n";
        $numFiles=0;

        //delete the file
        unlink($myFile);

        //Loop the dir and count the file in it
        while (false !== ($file = readdir($handle))) {
            $numFiles = $numFiles + 1;
        }

        if($numFiles == 0) { 
            //delete the dir
            rmdir($fileDir);
        }

        closedir($handle);
    }
}
?>
0 голосов
/ 17 августа 2011
if (is_file($value)) { 
  unlink($value); 

} else if (is_dir($value)) {
  if  (count(scandir($value)) == 2) }
     unlink($value)  
  }
}

http://php.net/manual/en/function.is-dir.php

http://www.php.net/manual/en/function.scandir.php

...