2011-09-21 17 views
60

Sto usando il seguente script per leggere una directory. Se non ci sono file nella directory dovrebbe dire vuoto. Il problema è che continua a dire che la directory è vuota anche se ci sono file all'interno e viceversa.Come si può usare PHP per verificare se una directory è vuota?

<?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"; 
?> 
+8

E 'solo un errore di battitura nella vostra istruzione if. Usa == (confronta) invece del singolo = (assegna). –

risposta

107

Sembra che avete bisogno di scandir invece di glob, come glob non può vedere i file nascosti unix.

<?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); 
} 
?> 

Si noti che questo codice non è il vertice di efficienza, in quanto è necessario leggere tutti i file solo per dire se la directory è vuota. Così, la versione migliore sarebbe

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

A proposito, non usare parole di sostituire booleane valori. Lo scopo stesso di quest'ultimo è dirti se qualcosa è vuoto o no. Un'espressione

a === b 

torna già Empty o Non Empty in termini di linguaggio di programmazione, FALSE o TRUE rispettivamente - in modo, è possibile utilizzare il molto frutto in strutture di controllo come IF() senza valori intermedi

+2

Penso che sia il nostro codice sia sbagliato perché ho rimosso tutti i file dalla cartella e ancora dice che la cartella non è vuota ... c'è un modo per controllare i file nascosti come thumbs.db ecc in linux ?? – TheBlackBenzKid

+0

Penso che la cartella FTP sia dire ... e. nel file è vuoto. Come posso verificare se e rimuovere il .. e thumbs.db etc ?? – TheBlackBenzKid

+0

glob non supporta i file nascosti di Linux. se li vuoi devi andare per la soluzione openir come nella risposta cancellata –

7

uso

if ($q == "Empty") 

invece di

if ($q="Empty") 
4

Probabilmente a causa di operatore di assegnazione in if dichiarazione.

Cambio:

if ($q="Empty") 

A:

if ($q=="Empty") 
4

Prova questo:

<?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"; 
} 

?> 
+0

Grazie! L'ho scritto abbastanza velocemente ed è il mio primo post qui @Piotr Nowicki – Drmzindec

+0

Sicuramente amico, è solo un mio dovere civico ;-) Benvenuto su StackOverflow! –

1

@ il buon senso

Penso che il tuo esempio performante potrebbe essere più performante utilizzando rigoroso confronto:

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; 
} 
+1

Buon punto per quanto riguarda la pulizia: il caso 'return false' non se ne sta prendendo cura ;-) –

+0

@BeatChristen Thx per il suggerimento! Aggiustato. –

2

Basta correggere il vostro codice come questo:

<?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"; 
    } 
?> 
54

Credo che utilizzando il FilesystemIterator dovrebbe essere il modo più semplice e rapido:

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

o utilizzando l'accesso membro della classe in esemplificazione:

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

Questo funziona perché un nuovo FilesystemIterator inizialmente punterà al primo file nella cartella - se non ci sono file nella cartella, valid() restituirà false. (consultare la documentazione here.)

Come sottolineato da abdulmanov.ilmir, è possibile controllare se la directory esiste prima di utilizzare lo FileSystemIterator perché altrimenti verrà generato un UnexpectedValueException.

+3

Mmm ... formicolio ai fianchi per questo. –

+0

Funziona come un incantesimo con l'elefante 5.3 – userlond

+1

Si dovrebbe considerare che se '$ dir' non esiste allora verrà lanciata un'eccezione. –

8

ho trovato una soluzione rapida

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

Questo codice funziona per me. –

+0

La soluzione che utilizzo in php 5.2 per casi semplici. –

0

Io uso questo metodo nel mio Wordpress CSV 2 plugin di 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 
} 

Funziona per estensione specifica, ma è facilmente modificato per soddisfare le vostre esigenze, eliminando "nuova RegexIterator (" linea. Conte $ all_files.

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

     return count($all_files); 
    } 
0

Ho avuto un problema simile di recente, anche se, la la risposta più alta votata non ha funzionato per me, quindi, ho dovuto trovare una soluzione simile e anche questo potrebbe non essere il modo più efficace per risolvere il problema,

Ho creato una funzione come so

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; 
     } 

e lo usavano per verificare la presenza di dricetory vuoto in questo modo

if(is_empty_dir($path)){ 
      rmdir($path); 
     } 
4

Questa è una discussione molto vecchio, ma ho pensato di dare il mio dieci centesimi. Le altre soluzioni non hanno funzionato per me.

Ecco la mia soluzione:

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

breve e dolce. Funziona come un fascino.

4

Per un approccio orientato agli oggetti che utilizza da Standard PHP Library (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; 
    } 
} 

Non c'è bisogno di fare un'istanza del FileHelper ogni volta che serve, è possibile accedere a questo metodo statico ovunque ne abbiate bisogno in questo modo:

FileHelper::isEmpty($dir); 

La classe FileHelper può essere esteso con altre utili metodi per copiare, cancellare, rinominare, ecc.

Non è necessario controllare la validità della directory all'interno del metodo perché se non è valido il costruttore di RecursiveDirectoryIterator lancia un UnexpectedValueException che copre sufficientemente quella parte.

0

È possibile utilizzare questo:

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