it-swarm.com.de

Wie kann ich verwenden? PHP um zu überprüfen, ob ein Verzeichnis leer ist?

Ich verwende das folgende Skript, um ein Verzeichnis zu lesen. Wenn sich keine Datei im Verzeichnis befindet, sollte es leer sein. Das Problem ist, es heißt immer wieder, dass das Verzeichnis leer ist, obwohl sich Dateien darin befinden und umgekehrt.

<?php
$pid    =       $_GET["prodref"];
$dir    =       '/assets/'.$pid.'/v';
$q     =        (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';

    if ($q=="Empty")
        echo "the folder is empty"; 
    else
        echo "the folder is NOT empty";
?>
66
TheBlackBenzKid

Es scheint, dass Sie scandir anstelle von glob benötigen, da glob keine versteckten Unix-Dateien sehen kann.

<?php
$pid = basename($_GET["prodref"]); //let's sanitize it a bit
$dir = "/assets/$pid/v";

if (is_dir_empty($dir)) {
  echo "the folder is empty"; 
}else{
  echo "the folder is NOT empty";
}

function is_dir_empty($dir) {
  if (!is_readable($dir)) return NULL; 
  return (count(scandir($dir)) == 2);
}
?>

Beachten Sie, dass dieser Code nicht der Gipfel der Effizienz ist, da nicht alle Dateien gelesen werden müssen, nur um festzustellen, ob das Verzeichnis leer ist. Die bessere Version wäre also

function dir_is_empty($dir) {
  $handle = opendir($dir);
  while (false !== ($entry = readdir($handle))) {
    if ($entry != "." && $entry != "..") {
      closedir($handle);
      return FALSE;
    }
  }
  closedir($handle);
  return TRUE;
}

Verwenden Sie übrigens nicht words , um boolean values ​​zu ersetzen. Der letztere Zweck besteht darin, Ihnen zu sagen, ob etwas leer ist oder nicht. Ein

a === b

der Ausdruck gibt bereits Empty oder Non Empty in Bezug auf die Programmiersprache FALSE bzw. TRUE zurück. Sie können also das Ergebnis in Kontrollstrukturen wie IF() ohne Zwischenwerte verwenden

118

Ich denke, der FilesystemIterator sollte der schnellste und einfachste Weg sein:

// PHP 5 >= 5.3.0
$iterator = new \FilesystemIterator($dir);
$isDirEmpty = !$iterator->valid();

Oder verwenden Sie den Teilnehmerzugriff bei der Instantiierung:

// PHP 5 >= 5.4.0
$isDirEmpty = !(new \FilesystemIterator($dir))->valid();

Dies funktioniert, weil eine neue FilesystemIterator anfänglich auf die erste Datei im Ordner verweist. Wenn sich keine Dateien im Ordner befinden, gibt valid()false zurück. (siehe Dokumentation hier .)

Prüfen Sie optional, ob das Verzeichnis vorhanden ist, bevor Sie die Variable FileSystemIterator verwenden, da andernfalls eine Variable UnexpectedValueException ausgegeben wird.

60
flu

Ich habe eine schnelle Lösung gefunden

<?php
  $dir = 'directory'; // dir path assign here
  echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';
?>
9
Frank

benutzen 

if ($q == "Empty")

anstatt

if ($q="Empty")
7
Toto

Versuche dies:

<?php
$dirPath = "Add your path here";

$destdir = $dirPath;

$handle = opendir($destdir);
$c = 0;
while ($file = readdir($handle)&& $c<3) {
    $c++;
}

if ($c>2) {
    print "Not empty";
} else {
    print "Empty";
} 

?>
4
Drmzindec

Wahrscheinlich wegen des Zuweisungsoperators in der Anweisung if.

Veränderung:

if ($q="Empty")

Zu:

if ($q=="Empty")
4
Robik

Für einen objektorientierten Ansatz unter Verwendung der RecursiveDirectoryIterator aus der Standard PHP - Bibliothek (SPL) .

<?php

namespace My\Folder;

use RecursiveDirectoryIterator;

class FileHelper
{
    /**
     * @param string $dir
     * @return bool
     */
    public static function isEmpty($dir)
    {
        $di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS);
        return iterator_count($di) === 0;
    }
}

Sie müssen keine Instanz Ihrer FileHelper erstellen, wann immer Sie sie benötigen. Sie können auf diese statische Methode zugreifen, wo immer Sie sie benötigen:

FileHelper::isEmpty($dir);

Die FileHelper-Klasse kann mit anderen nützlichen Methoden zum Kopieren, Löschen, Umbenennen usw. erweitert werden.

Es ist nicht erforderlich, die Gültigkeit des Verzeichnisses innerhalb der Methode zu überprüfen, da der Konstruktor der Variablen RecursiveDirectoryIterator bei einer ungültigen Angabe eine Variable UnexpectedValueException auslöst, die diesen Teil ausreichend behandelt.

4
Wilt

Dies ist ein sehr alter Thread, aber ich dachte, ich würde meine zehn Cent geben. Die anderen Lösungen funktionierten nicht für mich.

Hier ist meine Lösung:

function is_dir_empty($dir) {
    foreach (new DirectoryIterator($dir) as $fileInfo) {
        if($fileInfo->isDot()) continue;
        return false;
    }
    return true;
}

Kurz und bündig. Klappt wunderbar.

4
narfie

@ Ihr gesunder Menschenverstand

Ich denke, Ihr performantes Beispiel könnte durch einen strengen Vergleich performanter sein:

function is_dir_empty($dir) {
  if (!is_readable($dir)) return null; 
  $handle = opendir($dir);
  while (false !== ($entry = readdir($handle))) {
    if ($entry !== '.' && $entry !== '..') { // <-- better use strict comparison here
      closedir($handle); // <-- always clean up! Close the directory stream
      return false;
    }
  }
  closedir($handle); // <-- always clean up! Close the directory stream
  return true;
}
2
André Fiedler

Korrigieren Sie einfach Ihren Code wie folgt:

<?php
    $pid = $_GET["prodref"];
    $dir = '/assets/'.$pid.'/v';
    $q = count(glob("$dir/*")) == 0;

    if ($q) {
        echo "the folder is empty"; 
    } else {
        echo "the folder is NOT empty";
    }
?>
2

Sie können dies verwenden:

function isEmptyDir($dir)
{
    return (($files = @scandir($dir)) && count($files) <= 2);
}
0
karrtojal

Ich hatte in letzter Zeit ein ähnliches Problem, obwohl die höchste Antwort nicht wirklich für mich funktionierte, daher musste ich eine ähnliche Lösung finden. und wiederum ist dies möglicherweise nicht der effizienteste Weg, um das Problem zu lösen, 

Ich habe eine Funktion so erstellt

function is_empty_dir($dir)
   {
       if (is_dir($dir))
       {
            $objects = scandir($dir);
            foreach ($objects as $object)
            {
                if ($object != "." && $object != "..")
                {
                    if (filetype($dir."/".$object) == "dir")
                    {
                         return false;
                    } else { 
                        return false;
                    }
                }
            }
            reset($objects);
            return true;
       }

und benutzte es, um nach leerem Dricetory zu suchen

if(is_empty_dir($path)){
            rmdir($path);
        }
0
user28864

Ich verwende diese Methode in meinem Plugin für Wordpress CSV 2 POST.

    public function does_folder_contain_file_type( $path, $extension ){
        $all_files  = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) );

        $html_files = new RegexIterator( $all_files, '/\.'.$extension.'/' );  

        foreach( $html_files as $file) {
            return true;// a file with $extension was found
        }   

    return false;// no files with our extension found
}

Es funktioniert nach bestimmten Erweiterungen, kann jedoch leicht an Ihre Anforderungen angepasst werden, indem Sie die Zeile "new RegexIterator (") entfernen.

    public function does_folder_contain_file_type( $path, $extension ){
        $all_files  = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) );

        return count( $all_files );
    }
0
Ryan Bayne

Die erste Frage ist, wann ein Verzeichnis leer ist. In einem Verzeichnis befinden sich 2 Dateien die '.' und '..'.
Außerdem gibt es auf einem Mac vielleicht die Datei '.DS_Store'. Diese Datei wird erstellt, wenn dem Verzeichnis Inhalt hinzugefügt wird. Wenn sich diese 3 Dateien in dem Verzeichnis befinden, können Sie sagen, dass das Verzeichnis leer ist .. Um zu testen, ob ein Verzeichnis leer ist (ohne zu prüfen, ob $ dir ein Verzeichnis ist):

function isDirEmpty( $dir ) {
  $count = 0;
  foreach (new DirectoryIterator( $dir ) as $fileInfo) {
     if ( $fileInfo->isDot() || $fileInfo->getBasename() == '.DS_Store' ) {
        continue;
     }
     $count++;
  }
  return ($count === 0);
}
0
Harm