अगर निर्देशिका खाली है तो मैं कैसे PHP का उपयोग कर सकता हूं?


84

एक निर्देशिका को पढ़ने के लिए मैं निम्नलिखित स्क्रिप्ट का उपयोग कर रहा हूं। यदि निर्देशिका में कोई फ़ाइल नहीं है, तो उसे खाली कहना चाहिए। समस्या यह है, यह सिर्फ यह कहता है कि निर्देशिका खाली है भले ही अंदर फाइलें हों और इसके विपरीत।

<?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
यह आपके if स्टेटमेंट में सिर्फ एक टाइपो है। एकल = (असाइन) के बजाय == (तुलना) का उपयोग करें।
बास स्लैगटर

जवाबों:


134

ऐसा लगता है कि आपको scandirग्लोब की जगह जरूरत है , क्योंकि ग्लोब यूनिक्स की छिपी हुई फाइलों को नहीं देख सकता है।

<?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()बिना किसी मध्यवर्ती मूल्यों के जैसे नियंत्रण संरचनाओं में बहुत परिणाम का उपयोग कर सकते हैं


2
मुझे लगता है कि हमारा दोनों कोड गलत है क्योंकि मैंने फ़ोल्डर से सभी फ़ाइलों को हटा दिया है और यह अभी भी कहता है कि फ़ोल्डर खाली नहीं है ... क्या लिनक्स में thumbs.db आदि जैसी छिपी हुई फ़ाइलों की जांच करने का एक तरीका है ??
TheBlackBenzKid

मुझे लगता है कि FTP फ़ोल्डर कहते हैं .. और। फ़ाइल में खाली है। मैं कैसे जांच कर सकता हूं कि क्या और .. और thumbs.db आदि को हटा दें ??
TheBlackBenzKid

ग्लोब लिनक्स छिपी हुई फ़ाइलों का समर्थन नहीं करता है। यदि आप चाहते हैं कि आपको हटाए गए उत्तर की तरह ओपनर समाधान के लिए जाना है
आपका कॉमन सेंस

ऐसा लगता है कि आपको ग्लैंड की बजाय स्कैंडिर की जरूरत है।
आपका कॉमन सेंस

2
परीक्षण वातावरण बनाएँ। जहां स्क्रिप्ट है उसी फ़ोल्डर में खाली निर्देशिका बनाएं। $dir = 'testfolder';मैन्युअल रूप से बनाएं । फिर इस कोड को चलाएं। डिबग प्रिंट कर रहा है कि जितनी संभव हो उतनी जानकारी दिखाई दे रही है कि क्या गलत हो रहा है। $dir = 'testfolder';var_dump(scan_dir($dir));आपको बताएगा कि इस निर्देशिका में क्या है
आपका कॉमन सेंस

70

मुझे लगता है कि 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। ( यहां प्रलेखन देखें ।)

Abdulmanov.ilmir द्वारा बताया गया है, वैकल्पिक रूप से जाँच करें कि क्या निर्देशिका का उपयोग करने से पहले मौजूद है FileSystemIteratorक्योंकि अन्यथा यह एक फेंक देगा UnexpectedValueException


8
मम्म… इस एक के लिए मेरी गोद में झुनझुनाहट।
मैट फ्लेचर

3
आपको विचार करना चाहिए कि यदि $dirमौजूद नहीं है तो एक अपवाद फेंक दिया जाएगा।
abdulmanov.ilmir

10

मुझे एक त्वरित समाधान मिला

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

समाधान मैं php 5.2 में साधारण मामले के लिए उपयोग करता हूं।
लुकास मॉर्गन

1
खबरदार कि छिपी हुई फाइलें नहीं दिखतीं। एक निर्देशिका जिसमें ".htaccess" है, को इस कोड के साथ खाली माना जाएगा
rosell.dk


5

मानक PHP लाइब्रेरी (SPL) के उपयोग RecursiveDirectoryIteratorसे ऑब्जेक्ट ओरिएंटेड दृष्टिकोण के लिए ।

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

FileHelperजब भी आपको इसकी आवश्यकता होती है, तब आपको इसका उदाहरण देने की कोई आवश्यकता नहीं है, आप इस स्थैतिक विधि तक पहुँच सकते हैं जहाँ आपको इसकी आवश्यकता हो:

FileHelper::isEmpty($dir);

FileHelperवर्ग, कॉपी करने को हटाने, नाम बदलने, आदि के लिए अन्य उपयोगी तरीकों के साथ बढ़ाया जा सकता है

विधि के अंदर निर्देशिका की वैधता की जांच करने की कोई आवश्यकता नहीं है क्योंकि यदि यह अमान्य है तो RecursiveDirectoryIteratorवसीयत का निर्माणकर्ता UnexpectedValueExceptionउस हिस्से को फेंक देगा जो उस हिस्से को पर्याप्त रूप से कवर करता है।


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

?>

धन्यवाद! मैंने इसे बहुत जल्दी लिखा है और इसकी पहली पोस्ट यहाँ @Piotr Nowicki
Drmzindec

यकीन है कि दोस्त, यह सिर्फ मेरा नागरिक कर्तव्य है;; StackOverflow में आपका स्वागत है!
पियोत्र नोविका

4

शायद ifबयान में असाइनमेंट ऑपरेटर की वजह से ।

परिवर्तन:

if ($q="Empty")

सेवा:

if ($q=="Empty")

4

यह एक बहुत पुराना धागा है, लेकिन मुझे लगा कि मैं अपने दस सेंट दे दूंगा। अन्य समाधान मेरे काम नहीं आए।

यहाँ मेरा समाधान है:

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

छोटा एवं सुन्दर। एक जादू की तरह काम करता है।


4

@ आपका कॉमन सेंस

मुझे लगता है कि आपके प्रदर्शन का उदाहरण सख्त तुलना का उपयोग करके अधिक प्रदर्शनकारी हो सकता है:

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
अच्छा बिंदु साफ अप के बारे में: return falseमामले इसके बारे में ;-) देखभाल नहीं ले रही है
बीट क्रिश्चियन

संकेत के लिए @BeatChristen Thx! ठीक कर दिया।
एंड्रे फिडलर

मुझे समझ में नहीं आता है कि आप क्यों कहते हैं कि "की तुलना करते समय सख्त तुलना का उपयोग करना बेहतर है।" तथा ".."। Readdir () फ़ंक्शन हमेशा एक स्ट्रिंग (या गलत) लौटाएगा, इसलिए मुझे बिंदु दिखाई नहीं देता है। मैं यह भी जोड़ना चाहूंगा कि स्वयं के बाद सफाई करना वास्तव में एक अच्छा विचार है, किसी को लगता है कि वापसी के बाद जब $ संभाल चर दायरे से बाहर हो जाता है, बंद () स्वचालित रूप से होगा, लेकिन मैंने अभी थोड़ा परीक्षण कार्यक्रम लिखा है, और यह नहीं है। जो अजीब है क्योंकि अन्य सामान, जैसे झुंड अपने आप होते हैं।
soger

@ AndréFiedler आप एक प्रतिभाशाली, शानदार और जिम्मेदार व्यक्ति हैं। अन्य सभी उत्तरों में, वे पहले फाइलों की कुल संख्या की गणना करते हैं और फिर गिनती> 0. जाँचते हैं, लेकिन यदि किसी निर्देशिका में एक भी फ़ाइल है, तो वह खाली नहीं है।
आशीष डोनरिया 16


3

समारोह का countउपयोग शायद बड़े सरणी पर धीमा। issetकभी तेज होता है

यह PHP> = 5.4.0 पर ठीक से काम करेगा ( यहाँ देखें चांगेलॉग )

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
}

अन्यथा, राम पर लोड फ़ाइल सूची से बचने के लिए @ योर कॉमन सेंस समाधान का उपयोग करना बेहतर है

SCANDIR_SORT_NONEविकल्प का उपयोग करके इस उत्तर को सुधारने के लिए @soger को भी धन्यवाद और वोट करें ।


3
जब तक हम प्रदर्शन के बारे में चिंता करते हैं, आप SCANDIR_SORT_NONE पैरामीटर को भी जोड़ना चाह सकते हैं।
सोगर

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

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
}

यह विशिष्ट विस्तार द्वारा काम करता है, लेकिन "नई रेगेएक्सइंटरेटर" ("लाइन) को हटाकर अपनी आवश्यकताओं के अनुरूप आसानी से बदल जाता है। $ all_iles को गिनें।

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

        return count( $all_files );
    }

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

और इसका इस्तेमाल खाली ड्रीकेट्री की जांच के लिए किया

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

0

आप इसका उपयोग कर सकते हैं:

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

0

पहला सवाल यह है कि निर्देशिका खाली कब है? एक निर्देशिका में 2 फाइलें हैं '।' तथा '..'।
इसके बाद एक मैक पर शायद वहाँ फ़ाइल '.DS_Store'। यह फ़ाइल तब बनाई जाती है जब निर्देशिका में किसी प्रकार की सामग्री जोड़ी जाती है। यदि ये 3 फाइलें निर्देशिका में हैं तो आप कह सकते हैं कि निर्देशिका खाली है। परीक्षण करने के लिए यदि कोई निर्देशिका खाली है (परीक्षण के बिना अगर $ dir एक निर्देशिका है):

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

0

@ आपका कॉमन सेंस, @ एनबी

आपके कोड में कुछ सुधार:

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

मैं परिणाम को संग्रहीत करने के लिए एक चर का उपयोग करता हूं और इसे सही पर सेट करता हूं।
यदि निर्देशिका खाली है केवल वही फ़ाइलें जो लौटाई जाती हैं। और .. (एक लिनक्स सर्वर पर, यदि आप की जरूरत है तो आप मैक के लिए स्थिति का विस्तार कर सकते हैं) और इसलिए स्थिति सच है।
फिर परिणाम का मूल्य गलत और 2 को तोड़ने के लिए सेट किया जाता है, यदि और जबकि लूप बाहर निकलता है तो निष्पादित किया गया अगला विवरण बंद होता है।
इसलिए, जबकि लूप में केवल 3 सर्कल होंगे, भले ही यह समाप्त हो जाए, भले ही निर्देशिका खाली हो या न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.