Do odczytu katalogu używam następującego skryptu. Jeśli w katalogu nie ma pliku, powinien być pusty. Problem polega na tym, że ciągle mówi, że katalog jest pusty, mimo że w nim znajdują się pliki i na odwrót.
<?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";
?>
Odpowiedzi:
Wygląda na to, że potrzebujesz
scandir
zamiast globu, ponieważ glob nie widzi ukrytych plików uniksowych.<?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); } ?>
Zauważ, że ten kod nie jest szczytem wydajności, ponieważ nie trzeba czytać wszystkich plików tylko po to, aby stwierdzić, czy katalog jest pusty. Więc lepsza byłaby wersja
function dir_is_empty($dir) { $handle = opendir($dir); while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { closedir($handle); return FALSE; } } closedir($handle); return TRUE; }
Nawiasem mówiąc, nie używaj słów do zastępowania wartości logicznych . Celem tego ostatniego jest poinformowanie Cię, czy coś jest puste, czy nie. Na
wyrażenie już zwraca
Empty
lubNon Empty
pod względem języka programowania,FALSE
lubTRUE
odpowiednio - więc możesz użyć samego wyniku w strukturach sterujących jakIF()
bez żadnych wartości pośrednichźródło
$dir = 'testfolder';
ręcznie. następnie uruchom ten kod. debug to drukowanie jak największej ilości informacji, aby zobaczyć, co się dzieje.$dir = 'testfolder';var_dump(scan_dir($dir));
powie ci, co jest w tym kataloguMyślę, że użycie FilesystemIterator powinno być najszybszym i najłatwiejszym sposobem:
// PHP 5 >= 5.3.0 $iterator = new \FilesystemIterator($dir); $isDirEmpty = !$iterator->valid();
Lub używając dostępu do członka klasy podczas tworzenia instancji:
// PHP 5 >= 5.4.0 $isDirEmpty = !(new \FilesystemIterator($dir))->valid();
To działa, ponieważ nowy
FilesystemIterator
będzie początkowo wskazywał na pierwszy plik w folderze - jeśli nie ma żadnych plików w folderze,valid()
zwrócifalse
. (zobacz dokumentację tutaj ).Jak wskazał abdulmanov.ilmir, opcjonalnie sprawdź, czy katalog istnieje przed użyciem,
FileSystemIterator
ponieważ w przeciwnym razie wyrzuci plikUnexpectedValueException
.źródło
$dir
nie istnieje, zostanie zgłoszony wyjątek.Znalazłem szybkie rozwiązanie
<?php $dir = 'directory'; // dir path assign here echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty'; ?>
źródło
posługiwać się
if ($q == "Empty")
zamiast
if ($q="Empty")
źródło
Dla podejścia obiektowego Używanie
RecursiveDirectoryIterator
z biblioteki PHP Standard (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; } }
Nie musisz tworzyć instancji,
FileHelper
kiedy jej potrzebujesz, możesz uzyskać dostęp do tej statycznej metody wszędzie tam, gdzie jej potrzebujesz:FileHelper::isEmpty($dir);
FileHelper
Klasa może zostać przedłużony w przypadku innych przydatnych metod kopiowanie, usuwanie, zmiana nazwy, itpNie ma potrzeby sprawdzania poprawności katalogu wewnątrz metody, ponieważ jeśli jest on niepoprawny, konstruktor metody
RecursiveDirectoryIterator
wyrzuci kod,UnexpectedValueException
który obejmuje tę część w wystarczającym stopniu.źródło
Spróbuj tego:
<?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"; } ?>
źródło
Prawdopodobnie z powodu operatora przypisania w
if
instrukcji.Zmiana:
if ($q="Empty")
Do:
if ($q=="Empty")
źródło
To bardzo stara nić, ale pomyślałem, że dam dziesięć centów. Inne rozwiązania u mnie nie działały.
Oto moje rozwiązanie:
function is_dir_empty($dir) { foreach (new DirectoryIterator($dir) as $fileInfo) { if($fileInfo->isDot()) continue; return false; } return true; }
Krótkie i słodkie. Działa jak marzenie.
źródło
@ Twój zdrowy rozsądek
Myślę, że Twój skuteczny przykład mógłby być bardziej wydajny przy użyciu ścisłego porównania:
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; }
źródło
return false
sprawa się tym nie zajmuje ;-)Użyłem:
if(is_readable($dir)&&count(scandir($dir))==2) ... //then the dir is empty
źródło
count
Użycie funkcji może być powolne na dużej tablicy.isset
jest coraz szybszyTo będzie działać poprawnie na PHP> = 5.4.0 (zobacz Changelog tutaj )
function dir_is_empty($path){ //$path is realpath or relative path $d = scandir($path, SCANDIR_SORT_NONE ); // get dir, without sorting improve performace (see Comment below). if ($d){ // avoid "count($d)", much faster on big array. // Index 2 means that there is a third element after ".." and "." return !isset($d[2]); } return false; // or throw an error }
W przeciwnym razie, używając rozwiązania @Your Common Sense, lepiej jest unikać ładowania listy plików do pamięci RAM
Dziękuję i zagłosuj również na @soger, aby ulepszyć tę odpowiedź za pomocą
SCANDIR_SORT_NONE
opcji.źródło
Po prostu popraw kod w ten sposób:
<?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"; } ?>
źródło
Używam tej metody w mojej wtyczce POST do Wordpress CSV 2.
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 }
Działa według określonego rozszerzenia, ale można go łatwo zmienić w zależności od potrzeb, usuwając wiersz „nowy RegexIterator (”. Count $ all_files.
public function does_folder_contain_file_type( $path, $extension ){ $all_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) ); return count( $all_files ); }
źródło
Miałem ostatnio podobny problem, chociaż najwyższa pozytywna odpowiedź nie działała dla mnie, stąd musiałem wymyślić podobne rozwiązanie. i znowu może to nie być najskuteczniejszy sposób rozwiązania problemu,
Stworzyłem taką funkcję
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; }
i użył go do sprawdzenia pustej dricetory
if(is_empty_dir($path)){ rmdir($path); }
źródło
Możesz użyć tego:
function isEmptyDir($dir) { return (($files = @scandir($dir)) && count($files) <= 2); }
źródło
Pierwsze pytanie brzmi: kiedy katalog jest pusty? W katalogu znajdują się 2 pliki „.” i '..'.
Oprócz tego na Macu może być plik „.DS_Store”. Ten plik jest tworzony, gdy do katalogu zostanie dodana jakaś zawartość. Jeśli te 3 pliki znajdują się w katalogu, możesz powiedzieć, że katalog jest pusty. Aby sprawdzić, czy katalog jest pusty (bez testowania, jeśli $ dir jest katalogiem):
function isDirEmpty( $dir ) { $count = 0; foreach (new DirectoryIterator( $dir ) as $fileInfo) { if ( $fileInfo->isDot() || $fileInfo->getBasename() == '.DS_Store' ) { continue; } $count++; } return ($count === 0); }
źródło
@ Your Common Sense, @ Enyby
Pewne ulepszenie twojego kodu:
function dir_is_empty($dir) { $handle = opendir($dir); $result = true; while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { $result = false; break 2; } } closedir($handle); return $result; }
Używam zmiennej do przechowywania wyniku i ustawiam ją na true.
Jeśli katalog jest pusty, jedynymi zwracanymi plikami są. i .. (na serwerze linuxowym możesz rozszerzyć warunek dla mac, jeśli chcesz) i dlatego warunek jest prawdziwy.
Następnie wartość result jest ustawiana na false i break 2 wychodzi z pętli if i while, więc następna wykonywana instrukcja jest zamknięta.
Dlatego pętla while będzie miała tylko 3 okręgi przed zakończeniem, niezależnie od tego, czy katalog jest pusty, czy nie.
źródło