PHP दी गई डायरेक्टरी की सभी उपनिर्देशिकाएँ प्राप्त करें


139

मैं फ़ाइलों के बिना दिए गए निर्देशिका के सभी उप-निर्देशिकाओं को कैसे प्राप्त कर सकता हूं, .(वर्तमान निर्देशिका) या ..(मूल निर्देशिका) और फिर किसी फ़ंक्शन में प्रत्येक निर्देशिका का उपयोग कर सकता हूं ?

जवाबों:


210

आप विकल्प के साथ ग्लोब () का उपयोग कर सकते हैंGLOB_ONLYDIR

या

$dirs = array_filter(glob('*'), 'is_dir');
print_r( $dirs);

जो उपनिर्देशिका भी देता है?
गॉर्डन

2
आपको यहां एक पुनर्मिलन करना होगा
जोसेफ सेबल

क्षमा करें, यहां GLOB_ONLYDIR विकल्प कहां है ??
डेवलेपर

5
@developerbmw शब्द पर ध्यान दें या । वह लक्ष्य प्राप्ति के दो अलग-अलग तरीके प्रस्तुत करता है।
केन वेन वेंडरलिन्डे

7
हालांकि, एक अच्छा, सरल दृष्टिकोण, स्वीकृत जवाब सवाल का जवाब नहीं देता है: मूल निर्देशिका (वर्तमान कामकाजी निर्देशिका के उर्फ ​​भाई-बहन) से उप-निर्देशिका प्राप्त करना। ऐसा करने के लिए इसे कार्यशील निर्देशिका को मूल निर्देशिका में बदलने की आवश्यकता होगी।
राणीम r

156

यहां बताया गया है कि आप GLOB के साथ केवल निर्देशिका कैसे प्राप्त कर सकते हैं:

$directories = glob($somePath . '/*' , GLOB_ONLYDIR);

2
इसमें मुख्य निर्देशिका भी शामिल है।
15:49 पर user4951

3
यह मेरे मामले में मुख्य निर्देशिका (विंडोज) को शामिल नहीं करता है
20'14

1
यह मेरे लिए मैक लाइनक्स पर मुख्य निर्देशिका को शामिल नहीं करता है। हो सकता है कि इसका इस्तेमाल किए गए रास्ते से हो?
जेक

1
इसमें $somePathआउटपुट में पथ भी शामिल है
गॉडफादर

47

Spl DirectoryIterator वर्ग फ़ाइल सिस्टम निर्देशिकाओं की सामग्री को देखने के लिए एक सरल इंटरफ़ेस प्रदान करता है।

$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
    if ($fileinfo->isDir() && !$fileinfo->isDot()) {
        echo $fileinfo->getFilename().'<br>';
    }
}

27

आपके पिछले प्रश्न के समान ही :

$iterator = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator($yourStartingPath), 
            RecursiveIteratorIterator::SELF_FIRST);

foreach($iterator as $file) {
    if($file->isDir()) {
        echo strtoupper($file->getRealpath()), PHP_EOL;
    }
}

strtoupperअपने इच्छित कार्य से बदलें ।


1
अच्छा धन्यवाद! एक और सवाल: मैं केवल उप-डायर नाम को पूरे रास्ते से कैसे अलग कर सकता हूं?
एड्रियन एम।

@ एड्रियन कृपया अपने अन्य प्रश्न में दिए गए एपीआई प्रलेखन पर एक नज़र डालें। getFilename()केवल निर्देशिका नाम लौटाएगा।
गॉर्डन

1
डॉट्स से छुटकारा पाने के लिए, मुझे कंस्ट्रक्टर के RecursiveDirectoryIterator::SKIP_DOTSदूसरे तर्क के रूप में जोड़ना था RecursiveDirectoryIterator
कोलन डिक

5

इस कोड को आज़माएं:

<?php
$path = '/var/www/html/project/somefolder';

$dirs = array();

// directory handle
$dir = dir($path);

while (false !== ($entry = $dir->read())) {
    if ($entry != '.' && $entry != '..') {
       if (is_dir($path . '/' .$entry)) {
            $dirs[] = $entry; 
       }
    }
}

echo "<pre>"; print_r($dirs); exit;

4

ऐरे में:

function expandDirectoriesMatrix($base_dir, $level = 0) {
    $directories = array();
    foreach(scandir($base_dir) as $file) {
        if($file == '.' || $file == '..') continue;
        $dir = $base_dir.DIRECTORY_SEPARATOR.$file;
        if(is_dir($dir)) {
            $directories[]= array(
                    'level' => $level
                    'name' => $file,
                    'path' => $dir,
                    'children' => expandDirectoriesMatrix($dir, $level +1)
            );
        }
    }
    return $directories;
}

//पहुंच:

$dir = '/var/www/';
$directories = expandDirectoriesMatrix($dir);

echo $directories[0]['level']                // 0
echo $directories[0]['name']                 // pathA
echo $directories[0]['path']                 // /var/www/pathA
echo $directories[0]['children'][0]['name']  // subPathA1
echo $directories[0]['children'][0]['level'] // 1
echo $directories[0]['children'][1]['name']  // subPathA2
echo $directories[0]['children'][1]['level'] // 1

सभी को दिखाने के लिए उदाहरण:

function showDirectories($list, $parent = array())
{
    foreach ($list as $directory){
        $parent_name = count($parent) ? " parent: ({$parent['name']}" : '';
        $prefix = str_repeat('-', $directory['level']);
        echo "$prefix {$directory['name']} $parent_name <br/>";  // <-----------
        if(count($directory['children'])){
            // list the children directories
            showDirectories($directory['children'], $directory);
        }
    }
}

showDirectories($directories);

// pathA
// - subPathA1 (parent: pathA)
// -- subsubPathA11 (parent: subPathA1)
// - subPathA2 
// pathB
// pathC

2
<?php
    /*this will do what you asked for, it only returns the subdirectory names in a given
      path, and you can make hyperlinks and use them:
    */

    $yourStartingPath = "photos\\";
    $iterator = new RecursiveIteratorIterator( 
        new RecursiveDirectoryIterator($yourStartingPath),  
        RecursiveIteratorIterator::SELF_FIRST);

    foreach($iterator as $file) { 
        if($file->isDir()) { 
            $path = strtoupper($file->getRealpath()) ; 
            $path2 = PHP_EOL;
            $path3 = $path.$path2;

            $result = end(explode('/', $path3)); 

            echo "<br />". basename($result );
        } 
    } 

    /* best regards,
        Sanaan Barzinji
        Erbil
    */
?>

2

आप इस फ़ंक्शन को आज़मा सकते हैं (PHP 7 आवश्यक)

function getDirectories(string $path) : array
{
    $directories = [];
    $items = scandir($path);
    foreach ($items as $item) {
        if($item == '..' || $item == '.')
            continue;
        if(is_dir($path.'/'.$item))
            $directories[] = $item;
    }
    return $directories;
}

1

सही तरीका

/**
 * Get all of the directories within a given directory.
 *
 * @param  string  $directory
 * @return array
 */
function directories($directory)
{
    $glob = glob($directory . '/*');

    if($glob === false)
    {
        return array();
    }

    return array_filter($glob, function($dir) {
        return is_dir($dir);
    });
}

लारवेल से प्रेरित


1
ऐसा लगता है जब एक झंडा है GLOB_ONLYDIR, तो overkill देखें php.net/manual/en/function.glob.php
रॉबर्ट पाउंडर

0

यह एक लाइनर कोड है:

 $sub_directories = array_map('basename', glob($directory_path . '/*', GLOB_ONLYDIR));

0

गैर-पुनरावर्ती सूची केवल निर्देशिकाएँ

एकमात्र प्रश्न जो प्रत्यक्ष ने पूछा है, उसे गलती से बंद कर दिया गया है, इसलिए मुझे इसे यहाँ रखना होगा।

यह निर्देशिकाओं को फ़िल्टर करने की क्षमता भी देता है।

/**
 * Copyright © 2020 Theodore R. Smith <https://www.phpexperts.pro/>
 * License: MIT
 *
 * @see https://stackoverflow.com/a/61168906/430062
 *
 * @param string $path
 * @param bool   $recursive Default: false
 * @param array  $filtered  Default: [., ..]
 * @return array
 */
function getDirs($path, $recursive = false, array $filtered = [])
{
    if (!is_dir($path)) {
        throw new RuntimeException("$path does not exist.");
    }

    $filtered += ['.', '..'];

    $dirs = [];
    $d = dir($path);
    while (($entry = $d->read()) !== false) {
        if (is_dir("$path/$entry") && !in_array($entry, $filtered)) {
            $dirs[] = $entry;

            if ($recursive) {
                $newDirs = getDirs("$path/$entry");
                foreach ($newDirs as $newDir) {
                    $dirs[] = "$entry/$newDir";
                }
            }
        }
    }

    return $dirs;
}


-1

सभी PHP फ़ाइलों को पुनरावर्ती खोजें। तर्क को आसान करना चाहिए और फ़ंक्शन कॉल से बचकर इसका उद्देश्य तेज़ (एर) होना चाहिए।

function get_all_php_files($directory) {
    $directory_stack = array($directory);
    $ignored_filename = array(
        '.git' => true,
        '.svn' => true,
        '.hg' => true,
        'index.php' => true,
    );
    $file_list = array();
    while ($directory_stack) {
        $current_directory = array_shift($directory_stack);
        $files = scandir($current_directory);
        foreach ($files as $filename) {
            //  Skip all files/directories with:
            //      - A starting '.'
            //      - A starting '_'
            //      - Ignore 'index.php' files
            $pathname = $current_directory . DIRECTORY_SEPARATOR . $filename;
            if (isset($filename[0]) && (
                $filename[0] === '.' ||
                $filename[0] === '_' ||
                isset($ignored_filename[$filename])
            )) 
            {
                continue;
            }
            else if (is_dir($pathname) === TRUE) {
                $directory_stack[] = $pathname;
            } else if (pathinfo($pathname, PATHINFO_EXTENSION) === 'php') {
                $file_list[] = $pathname;
            }
        }
    }
    return $file_list;
}

सवाल फाइलों की सूची, या किसी भी पुनरावृत्ति के लिए नहीं पूछा। बस एक निर्देशिका में निर्देशिका की एक सूची है।
miken32

मैं अच्छी तरह से वाकिफ हूं। उस समय, मेरा मानना ​​है कि यह Google या इसी तरह का शीर्ष-उत्तर था, इसलिए मैंने एक पुनरावर्ती कार्यान्वयन की तलाश करने वालों के लिए अपना समाधान जोड़ा, जो स्टैक को उड़ा नहीं देता है। मुझे ऐसी कोई चीज़ प्रदान करने में कोई बुराई नहीं दिखती जिसे मूल समस्या के समाधान के लिए काटा जा सकता है।
सिलबिनलवॉल्फ

-1

यदि आप एक पुनरावर्ती निर्देशिका लिस्टिंग समाधान की तलाश कर रहे हैं। नीचे दिए गए कोड का उपयोग करें मुझे आशा है कि यह आपकी मदद करेगा।

<?php
/**
 * Function for recursive directory file list search as an array.
 *
 * @param mixed $dir Main Directory Path.
 *
 * @return array
 */
function listFolderFiles($dir)
{
    $fileInfo     = scandir($dir);
    $allFileLists = [];

    foreach ($fileInfo as $folder) {
        if ($folder !== '.' && $folder !== '..') {
            if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true) {
                $allFileLists[$folder . '/'] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder);
            } else {
                $allFileLists[$folder] = $folder;
            }
        }
    }

    return $allFileLists;
}//end listFolderFiles()


$dir = listFolderFiles('your searching directory path ex:-F:\xampp\htdocs\abc');
echo '<pre>';
print_r($dir);
echo '</pre>'

?>

-1

निम्न पुनरावर्ती फ़ंक्शन उप निर्देशिकाओं की पूरी सूची के साथ एक सरणी देता है

function getSubDirectories($dir)
{
    $subDir = array();
    $directories = array_filter(glob($dir), 'is_dir');
    $subDir = array_merge($subDir, $directories);
    foreach ($directories as $directory) $subDir = array_merge($subDir, getSubDirectories($directory.'/*'));
    return $subDir;
}

स्रोत: https://www.lucidar.me/en/web-dev/how-to-get-subdirectories-in-php/


प्रश्न पुनरावृत्ति के लिए नहीं पूछा। दी गई निर्देशिका में बस एक निर्देशिका की सूची, जो उन्हें 2010 में प्रदान की गई थी।
miken32

-2

एक निर्दिष्ट निर्देशिका के तहत सभी फ़ाइलों और फ़ोल्डरों का पता लगाएं।

function scanDirAndSubdir($dir, &$fullDir = array()){
    $currentDir = scandir($dir);

    foreach ($currentDir as $key => $val) {
        $realpath = realpath($dir . DIRECTORY_SEPARATOR . $val);
        if (!is_dir($realpath) && $filename != "." && $filename != "..") {
            scanDirAndSubdir($realpath, $fullDir);
            $fullDir[] = $realpath;
        }
    }

    return $fullDir;
}

var_dump(scanDirAndSubdir('C:/web2.0/'));

नमूना:

array (size=4)
  0 => string 'C:/web2.0/config/' (length=17)
  1 => string 'C:/web2.0/js/' (length=13)
  2 => string 'C:/web2.0/mydir/' (length=16)
  3 => string 'C:/web2.0/myfile/' (length=17)

यह पूर्ण उत्तर नहीं है, क्योंकि इसे चलाया नहीं जा सकता।
miken32

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