디렉토리가 비어 있는지 확인하기 위해 PHP를 사용하는 방법은 무엇입니까?

다음 스크립트를 사용하여 디렉토리를 읽고 있습니다.디렉토리에 파일이 없는 경우는, 「empty」라고 표시됩니다.문제는 내부에 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"; ?> 


질문에 대한 답변



필요한 것 같습니다.scandirglob 대신 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; } 

덧붙여서 부울값을 치환하기 위해 단어를 사용하지 마십시오.후자의 목적은 무엇인가 비어 있는지 아닌지를 알려주는 것입니다.

a === b 

식이 이미 반환되었습니다.Empty또는Non Empty프로그래밍 언어의 관점에서 보면false또는true따라서 다음과 같은 제어 구조에서 바로 그 결과를 사용할 수 있습니다.IF()중간값 없이




파일 시스템을 사용하여반복기는 가장 빠르고 쉬운 방법입니다.

// 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. (여기에 있는 매뉴얼을 참조해 주세요.

abdulmanov.ilmir에서 지적한 바와 같이 필요에 따라 디렉토리가 존재하는지 확인한 후FileSystemIterator안그러면 우리 둘 사이에UnexpectedValueException.




나는 빠른 해결책을 찾았다.

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



사용하다

if ($q == "Empty") 

대신

if ($q="Empty") 



Standard PHP Library(SPL; 표준 PHP 라이브러리)의 를 사용하는 객체 지향 접근법.

<?php
namespace MyFolder;
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;
} } 

의 예를 들 필요가 없습니다.FileHelper필요에 따라서, 다음과 같이, 필요한 장소에서 이 스태틱한 메서드에 액세스 할 수 있습니다.

FileHelper::isEmpty($dir); 

FileHelper클래스를 복사, 삭제, 이름 변경 등을 위한 다른 유용한 방법으로 확장할 수 있습니다.

메서드 내 디렉토리의 유효성을 확인할 필요가 없습니다.디렉토리가 무효인 경우, 이 디렉토리의 생성자가RecursiveDirectoryIterator던지다UnexpectedValueException그 부분은 충분히 커버할 수 있습니다.