我使用以下脚本来读取目录。如果目录中没有文件,则应该为空。问题是,它只是说目录是空的,即使里面有ARE文件,反之亦然。
<?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";
?>
答案 0 :(得分:118)
似乎你需要scandir
而不是glob,因为glob看不到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);
}
?>
请注意,此代码不是效率的顶峰,因为没有必要只读取所有文件来判断目录是否为空。所以,更好的版本将是
function dir_is_empty($dir) {
$handle = opendir($dir);
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
closedir($handle);
return FALSE;
}
}
closedir($handle);
return TRUE;
}
顺便说一下,不要使用单词来替换 boolean 值。后者的目的是告诉你某些事情是否空洞。一个
a === b
表达式已分别在编程语言Empty
或Non Empty
方面返回FALSE
或TRUE
- 因此,您可以在控件结构中使用结果{IF()
1}}没有任何中间值
答案 1 :(得分:60)
我认为使用FilesystemIterator应该是最快最简单的方法:
// PHP 5 >= 5.3.0
$iterator = new \FilesystemIterator($dir);
$isDirEmpty = !$iterator->valid();
或者在实例化时使用类成员访问:
// PHP 5 >= 5.4.0
$isDirEmpty = !(new \FilesystemIterator($dir))->valid();
这是有效的,因为新的FilesystemIterator
最初会指向文件夹中的第一个文件 - 如果文件夹中没有文件,valid()
将返回false
。 (见文件here。)
正如abdulmanov.ilmir所指出的那样,在使用FileSystemIterator
之前,可以选择检查目录是否存在,否则它会抛出UnexpectedValueException
。
答案 2 :(得分:9)
我找到了一个快速解决方案
<?php
$dir = 'directory'; // dir path assign here
echo (count(glob("$dir/*")) === 0) ? 'Empty' : 'Not empty';
?>
答案 3 :(得分:7)
使用
if ($q == "Empty")
而不是
if ($q="Empty")
答案 4 :(得分:4)
可能是因为if
语句中的赋值运算符。
变化:
if ($q="Empty")
要:
if ($q=="Empty")
答案 5 :(得分:4)
我用过:
if(is_readable($dir)&&count(scandir($dir))==2) ... //then the dir is empty
答案 6 :(得分:4)
对于使用RecursiveDirectoryIterator
中的Standard PHP Library (SPL)的面向对象方法。
FileHelper
无论何时需要,都无需创建FileHelper::isEmpty($dir);
的实例,您可以像这样在任何需要的地方访问此静态方法:
FileHelper
可以使用其他有用的方法扩展RecursiveDirectoryIterator
类,以便复制,删除,重命名等。
没有必要检查方法内部目录的有效性,因为如果它无效,UnexpectedValueException
的构造函数将抛出一个{{1}}来充分覆盖该部分。
答案 7 :(得分:4)
这是一个非常古老的线索,但我想我会给我十美分。其他解决方案对我不起作用。
这是我的解决方案:
<wsdlOption>
<wsdl>src/main/resources/wsdl/my_wsdl.wsdl</wsdl>
<extraargs>
<extraarg>-p</extraarg>
<extraarg>http://services.demo.es/=com.my.package.demo1</extraarg>
<extraarg>-p</extraarg>
<extraarg>http://tempuri.org/=com.my.package.demo2</extraarg>
<extraarg>-exsh</extraarg>
<extraarg>true</extraarg>
<extraarg>-client</extraarg>
<extraarg>-wsdlLocation</extraarg>
<extraarg></extraarg>
</extraargs>
</wsdlOption>
短而甜蜜。像魅力一样。
答案 8 :(得分:4)
试试这个:
<?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";
}
?>
答案 9 :(得分:3)
@ Your Common Sense
我认为使用严格的比较可以使您的高性能示例更具性能:
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;
}
答案 10 :(得分:3)
在大数组上使用功能count
的速度可能较慢。 isset
更快
这将在PHP> = 5.4.0上正常工作(请参见Changelog here)
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
}
否则,使用@Your常识解决方案最好避免在RAM上加载文件列表
也感谢并投票支持@soger,以使用SCANDIR_SORT_NONE
选项改善此答案。
答案 11 :(得分:2)
只需更正您的代码:
<?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";
}
?>
答案 12 :(得分:0)
我在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
}
它的工作方式是特定的扩展,但可以通过删除“新的RegexIterator(”行来计算$ all_files。
来轻松更改以满足您的需要。 public function does_folder_contain_file_type( $path, $extension ){
$all_files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path ) );
return count( $all_files );
}
答案 13 :(得分:0)
我最近遇到了类似的问题,但是,最高投票的答案对我来说并不合适,因此,我不得不提出类似的解决方案。再次,这也可能不是解决问题的最有效方式,
我创建了一个像这样的函数
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;
}
并用它来检查空的dricetory像这样
if(is_empty_dir($path)){
rmdir($path);
}
答案 14 :(得分:0)
您可以使用:
function isEmptyDir($dir)
{
return (($files = @scandir($dir)) && count($files) <= 2);
}
答案 15 :(得分:0)
第一个问题是什么时候目录为空?在目录中有2个文件'。'和'..'。 在Mac上的那个旁边可能有'.DS_Store'文件。将某种内容添加到目录时会创建此文件。如果这三个文件在目录中,您可能会说该目录为空。 所以要测试一个目录是否为空(如果$ dir是一个目录,则不测试):
function isDirEmpty( $dir ) {
$count = 0;
foreach (new DirectoryIterator( $dir ) as $fileInfo) {
if ( $fileInfo->isDot() || $fileInfo->getBasename() == '.DS_Store' ) {
continue;
}
$count++;
}
return ($count === 0);
}
答案 16 :(得分:0)
@您的常识,@ Enyby
您的代码有一些改进:
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;
}
我使用一个变量来存储结果并将其设置为true。
如果目录为空,则仅返回文件。和..(在linux服务器上,如果需要,可以扩展mac的条件),因此条件为true。
然后将result的值设置为false并让break 2退出if和while循环,以便关闭下一条执行的语句。
因此,无论目录是否为空,while循环在结束之前只有3个圈。