PHP удалить содержимое каталога - PullRequest
8 голосов
/ 05 февраля 2010

Как мне это сделать? Есть ли какой-нибудь метод, предусмотренный коханой 3?

Ответы [ 5 ]

10 голосов
/ 05 февраля 2010

Чтобы удалить каталог и весь этот контент, вам нужно написать некоторую рекурсивную функцию удаления - или использовать ту, которая уже существует.

Некоторые примеры можно найти в примечаниях пользователя на странице документации rmdir ; например, тот, который был предложен bcairns в августе 2009 (цитирование) :

<?php
// ensure $dir ends with a slash
function delTree($dir) {
    $files = glob( $dir . '*', GLOB_MARK );
    foreach( $files as $file ){
        if( substr( $file, -1 ) == '/' )
            delTree( $file );
        else
            unlink( $file );
    }
    rmdir( $dir );
}
?> 
5 голосов
/ 27 ноября 2013

Я предлагаю этот способ, простой и прямой.

    $files = glob('your/folder/' . '*', GLOB_MARK);
    foreach($files as $file)
    {
        if (is_dir($file)) {
            self::deleteDir($file);
        } else {
            unlink($file);
        }
    }
0 голосов
/ 09 июня 2018

Решение Pascal работает не на всех ОС. Для этого я создал другое решение. Код является частью статической библиотеки классов и является статическим.
Удаляет все файлы и каталоги в данном родительском каталоге.
Функция является рекурсивной для подкаталогов и имеет возможность не удалять родительский каталог ($ keepFirst).
Если родительский каталог не существует или не является каталогом, возвращается 'null'. В случае успешного удаления возвращается true.

/**
* Deletes all files in the given directory, also the subdirectories.
* @param string  $dir       Name of the directory
* @param boolean $keepFirst [Optional] indicator for first directory.
* @return null | true
*/
public static function deltree( $dir, $keepFirst = false ) {
  // First check if it is a directory.
  if (! is_dir( $dir ) ) {
     return null;
  }

  if ($handle = opendir( $dir ) ) {
     while (false !== ( $fileName = readdir($handle) ) ) {
        // Skips the hidden directory files.
        if ($fileName == "." || $fileName == "..") {
           continue;
        }

        $dpFile = sprintf( "%s/%s", $dir, $fileName );

        if (is_dir( $dpFile ) ) {
           self::deltree( $dpFile );
        } else {
           unlink( $dpFile );
        }
     }  // while

     // Directory removal, optional not the parent directory.
     if (! $keepFirst ) {
        rmdir( $dir );
     }
  }  // if
  return true;
}  // deltree
0 голосов
/ 05 февраля 2010

Я не уверен насчет Kohana 3, но я бы использовал DirectoryIterator() и unlink() в сочетании.

0 голосов
/ 05 февраля 2010

вы пробовали отсоединить в каталоге?

      chdir("file");
   foreach (glob("N*") as $filename )
      {
        unlink($filename);
      }

Это удаляет имена файлов, начинающиеся с N

...