PHP पुनरावर्ती फ़ंक्शन के साथ निर्देशिका में सभी फ़ाइलों और फ़ोल्डरों की सूची बनाएं


84

मैं एक निर्देशिका में सभी फ़ाइलों के माध्यम से जाने की कोशिश कर रहा हूं, और अगर कोई निर्देशिका है, तो इसकी सभी फाइलों से गुजरें और इतने पर जब तक जाने के लिए कोई और निर्देशिका न हो। प्रत्येक और संसाधित आइटम नीचे दिए गए फ़ंक्शन में परिणाम सरणी में जोड़े जाएंगे। यह काम नहीं कर रहा है, हालांकि मुझे यकीन नहीं है कि मैं क्या कर सकता हूं / मैंने क्या गलत किया, लेकिन नीचे दिए गए इस कोड को संसाधित करने पर ब्राउज़र बहुत धीमी गति से चलता है, किसी भी मदद की सराहना की जाती है, धन्यवाद!

कोड:

    function getDirContents($dir){
        $results = array();
        $files = scandir($dir);

            foreach($files as $key => $value){
                if(!is_dir($dir. DIRECTORY_SEPARATOR .$value)){
                    $results[] = $value;
                } else if(is_dir($dir. DIRECTORY_SEPARATOR .$value)) {
                    $results[] = $value;
                    getDirContents($dir. DIRECTORY_SEPARATOR .$value);
                }
            }
    }

    print_r(getDirContents('/xampp/htdocs/WORK'));

7
RecursiveDirectoryIterator
u_mulder

@ user3412869 यदि आपके पास .या तो फ़ंक्शन को कॉल न करें ..। मेरा जवाब देखिए।
ए -312

जवाबों:


148

एक निर्देशिका में सभी फ़ाइलों और फ़ोल्डरों को प्राप्त करें, जब आपके पास .या तो फ़ंक्शन को कॉल न करें..

तुम्हारा कोड :

<?php
function getDirContents($dir, &$results = array()) {
    $files = scandir($dir);

    foreach ($files as $key => $value) {
        $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
        if (!is_dir($path)) {
            $results[] = $path;
        } else if ($value != "." && $value != "..") {
            getDirContents($path, $results);
            $results[] = $path;
        }
    }

    return $results;
}

var_dump(getDirContents('/xampp/htdocs/WORK'));

आउटपुट (उदाहरण):

array (size=12)
  0 => string '/xampp/htdocs/WORK/iframe.html' (length=30)
  1 => string '/xampp/htdocs/WORK/index.html' (length=29)
  2 => string '/xampp/htdocs/WORK/js' (length=21)
  3 => string '/xampp/htdocs/WORK/js/btwn.js' (length=29)
  4 => string '/xampp/htdocs/WORK/js/qunit' (length=27)
  5 => string '/xampp/htdocs/WORK/js/qunit/qunit.css' (length=37)
  6 => string '/xampp/htdocs/WORK/js/qunit/qunit.js' (length=36)
  7 => string '/xampp/htdocs/WORK/js/unit-test.js' (length=34)
  8 => string '/xampp/htdocs/WORK/xxxxx.js' (length=30)
  9 => string '/xampp/htdocs/WORK/plane.png' (length=28)
  10 => string '/xampp/htdocs/WORK/qunit.html' (length=29)
  11 => string '/xampp/htdocs/WORK/styles.less' (length=30)

क्या परिणाम सरणी में प्रत्येक फ़ोल्डर को बनाना संभव होगा, क्या इसकी अपनी सरणी सभी बच्चों की फाइलों को पकड़े हुए है?
user3412869

लाइन 10 को बदलें:getDirContents($path, $results[$path]);
ए -312

1
scandir()प्रदर्शन महत्वपूर्ण होने पर एक अच्छे विचार की तरह उपयोग नहीं करता है। बेहतर विकल्प है RecursiveDirectoryIterator( php.net/manual/en/class.recursivedirectoryiterator.php )
मुगोमा जे। ओकोमा

जब डायरेक्टरी खाली होती है तो फंक्शन रिटर्न कुल गिनती 1
गुलाम अब्बास

उपयोग realpath()करने से एक ही निर्देशिका में प्रतीकात्मक लिंक का लक्ष्य नाम दिया जाएगा। उदाहरण के लिए, linux मशीन पर "/ usr / lib64" पर उदाहरण देखें।
मैटबियनको

104
$rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('path/to/folder'));

$files = array(); 

foreach ($rii as $file) {

    if ($file->isDir()){ 
        continue;
    }

    $files[] = $file->getPathname(); 

}



var_dump($files);

यह आपको पथ के साथ सभी फाइलें लाएगा।


क्या बिना निर्मित वस्तु के ऐसा करने का कोई तरीका नहीं है?
user3412869

4
या आप हालत को उल्टा कर सकते हैं if (!$file->isDir()) $files[] = $file->getPathname();:। एक पंक्ति को बचाने के लिए।
ए -312


$Regex = new RegexIterator($rii, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);
फॉरच्यूज़ में

@RazvanGrigore मुझे यकीन नहीं है कि यह गैर .और ..निर्देशिका के साथ कैसे मदद करता है । क्या आपको अभी भी उन लोगों को फ़िल्टर करने की आवश्यकता नहीं है?
War10ck

25

यह छोटा संस्करण है:

function getDirContents($path) {
    $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));

    $files = array(); 
    foreach ($rii as $file)
        if (!$file->isDir())
            $files[] = $file->getPathname();

    return $files;
}

var_dump(getDirContents($path));

7
डाउनवोट यह वास्तव में एक सुधार नहीं है। यह सिर्फ एक ही उत्तर है जो थोड़ा अलग तरीके से लिखा गया है। यह शैली के एक सवाल पर उतरता है। गार्ड क्लॉज़ (ज़नकोका का संस्करण) बिल्कुल ठीक है।
मरमसौस

4
ज़नकोका का संस्करण ठीक है, आपके जवाब की वास्तव में ज़रूरत नहीं है, एक टिप्पणी उसके लिए पर्याप्त थी। यह सिर्फ कोडिंग शैली के लिए नीचे आता है।
अगस्त ४

8

निर्देशिका में फ़िल्टर (2 डी तर्क) और फ़ोल्डरों के साथ सभी फाइलें प्राप्त करें , जब आपके पास .या तो फ़ंक्शन को कॉल न करें..

तुम्हारा कोड :

<?php
function getDirContents($dir, $filter = '', &$results = array()) {
    $files = scandir($dir);

    foreach($files as $key => $value){
        $path = realpath($dir.DIRECTORY_SEPARATOR.$value); 

        if(!is_dir($path)) {
            if(empty($filter) || preg_match($filter, $path)) $results[] = $path;
        } elseif($value != "." && $value != "..") {
            getDirContents($path, $filter, $results);
        }
    }

    return $results;
} 

// Simple Call: List all files
var_dump(getDirContents('/xampp/htdocs/WORK'));

// Regex Call: List php files only
var_dump(getDirContents('/xampp/htdocs/WORK', '/\.php$/'));

आउटपुट (उदाहरण):

// Simple Call
array(13) {
  [0]=> string(69) "/xampp/htdocs/WORK.htaccess"
  [1]=> string(73) "/xampp/htdocs/WORKConverter.php"
  [2]=> string(69) "/xampp/htdocs/WORKEvent.php"
  [3]=> string(70) "/xampp/htdocs/WORKdefault_filter.json"
  [4]=> string(68) "/xampp/htdocs/WORKdefault_filter.xml"
  [5]=> string(80) "/xampp/htdocs/WORKCaching/ApcCache.php"
  [6]=> string(84) "/xampp/htdocs/WORKCaching/CacheFactory.php"
}

// Regex Call
array(13) {
  [0]=> string(69) "/xampp/htdocs/WORKEvent.php"
  [1]=> string(73) "/xampp/htdocs/WORKConverter.php"
  [2]=> string(80) "/xampp/htdocs/WORKCaching/ApcCache.php"
  [3]=> string(84) "/xampp/htdocs/WORKCaching/CacheFactory.php"
}

जेम्स कैमरन का प्रस्ताव।


5

बदसूरत "foreach" नियंत्रण संरचनाओं के बिना मेरा प्रस्ताव है

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path));
$allFiles = array_filter(iterator_to_array($iterator), function($file) {
    return $file->isFile();
});

आप केवल फ़ाइलपथ निकालना चाहते हैं, जिसे आप ऐसा कर सकते हैं:

array_keys($allFiles);

अभी भी कोड की 4 लाइनें, लेकिन लूप या किसी चीज़ का उपयोग करने की तुलना में अधिक सीधे आगे।


1
एक ही समय में सभी फ़ाइलों और निर्देशिकाओं को मेमोरी में लोड करने से बचने के लिए, आप CallbackFilterIteratorबाद में लूप का उपयोग कर सकते हैं:$allFilesIterator = new CallbackFilterIterator($iterator, function(SplFileInfo $fileInfo) { return $fileInfo->isFile(); });
Aad Mathijssen

5

यदि आप निर्देशिका सामग्री को सरणी के रूप में प्राप्त करना चाहते हैं, तो छिपी हुई फ़ाइलों और निर्देशिकाओं को अनदेखा कर सकते हैं।

function dir_tree($dir_path)
{
    $rdi = new \RecursiveDirectoryIterator($dir_path);

    $rii = new \RecursiveIteratorIterator($rdi);

    $tree = [];

    foreach ($rii as $splFileInfo) {
        $file_name = $splFileInfo->getFilename();

        // Skip hidden files and directories.
        if ($file_name[0] === '.') {
            continue;
        }

        $path = $splFileInfo->isDir() ? array($file_name => array()) : array($file_name);

        for ($depth = $rii->getDepth() - 1; $depth >= 0; $depth--) {
            $path = array($rii->getSubIterator($depth)->current()->getFilename() => $path);
        }

        $tree = array_merge_recursive($tree, $path);
    }

    return $tree;
}

परिणाम कुछ इस तरह होगा;

dir_tree(__DIR__.'/public');

[
    'css' => [
        'style.css',
        'style.min.css',
    ],
    'js' => [
        'script.js',
        'script.min.js',
    ],
    'favicon.ico',
]

स्रोत


3

यहाँ मैं क्या लेकर आया हूँ और यह कोड की अधिक पंक्तियों के साथ नहीं है

function show_files($start) {
    $contents = scandir($start);
    array_splice($contents, 0,2);
    echo "<ul>";
    foreach ( $contents as $item ) {
        if ( is_dir("$start/$item") && (substr($item, 0,1) != '.') ) {
            echo "<li>$item</li>";
            show_files("$start/$item");
        } else {
            echo "<li>$item</li>";
        }
    }
    echo "</ul>";
}

show_files('./');

यह कुछ इस तरह का उत्पादन करता है

..idea
.add.php
.add_task.php
.helpers
 .countries.php
.mysqli_connect.php
.sort.php
.test.js
.test.php
.view_tasks.php

** डॉट्स अनरोडेड लिस्ट के डॉट्स हैं।

उम्मीद है की यह मदद करेगा।


चूँकि आपने प्रश्न के हल होने के दो साल बाद एक उत्तर जोड़ा: मैं स्वीकृत उत्तर या मुहावरेदार पुनर्संरचनाकर्ता समाधान पर आपका उपयोग क्यों करना चाहूंगा?
गॉर्डन

मैंने अभी कुछ महीने पहले ही PHP सीखना शुरू किया है। मैंने इस प्रश्न पर एक समाधान खोजा लेकिन अपने स्वयं के समाधान के साथ भी आने की कोशिश की। मैंने यह सोचकर पोस्ट किया कि शायद अगर मेरा समाधान किसी की मदद करता है।
कौशिक दास

1
केवल वही जो मेरे लिए आईआईएस विंडोज 2012 सर्वर पर आधारित PHP वेबसाइट पर काम करता था
मेलोमेन

3

यहां हॉर्स उत्तर का एक संशोधित संस्करण है, मेरे मामले के लिए थोड़ा बेहतर काम करता है, क्योंकि यह आधार निर्देशिका को स्ट्रिप्स करता है जो इसे जाते ही पास हो जाता है, और एक पुनरावर्ती स्विच होता है जिसे गलत पर सेट किया जा सकता है जो कि आसान भी है। साथ ही आउटपुट को अधिक पठनीय बनाने के लिए, मैंने फ़ाइल और उपनिर्देशिका फ़ाइलों को अलग कर दिया है, इसलिए फाइलें पहले जोड़ दी जाती हैं फिर उपनिर्देशिका फाइलें (मेरे कहने का परिणाम देखें।)

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

function get_filelist_as_array($dir, $recursive = true, $basedir = '', $include_dirs = false) {
    if ($dir == '') {return array();} else {$results = array(); $subresults = array();}
    if (!is_dir($dir)) {$dir = dirname($dir);} // so a files path can be sent
    if ($basedir == '') {$basedir = realpath($dir).DIRECTORY_SEPARATOR;}

    $files = scandir($dir);
    foreach ($files as $key => $value){
        if ( ($value != '.') && ($value != '..') ) {
            $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
            if (is_dir($path)) {
                // optionally include directories in file list
                if ($include_dirs) {$subresults[] = str_replace($basedir, '', $path);}
                // optionally get file list for all subdirectories
                if ($recursive) {
                    $subdirresults = get_filelist_as_array($path, $recursive, $basedir, $include_dirs);
                    $results = array_merge($results, $subdirresults);
                }
            } else {
                // strip basedir and add to subarray to separate file list
                $subresults[] = str_replace($basedir, '', $path);
            }
        }
    }
    // merge the subarray to give the list of files then subdirectory files
    if (count($subresults) > 0) {$results = array_merge($subresults, $results);}
    return $results;
}

मुझे लगता है कि एक बात का ध्यान रखना चाहिए कि इस फ़ंक्शन को कॉल करते समय $ आधारित मूल्य को पारित न करें ... ज्यादातर बस $ dir (या एक फ़ाइलपथ पास करने पर भी काम करेंगे) और वैकल्पिक रूप से $ recursive के रूप में अगर और जरूरत है। परिणाम:

[0] => demo-image.png
[1] => filelist.php
[2] => tile.png
[3] => 2015\header.png
[4] => 2015\08\background.jpg

का आनंद लें! ठीक है, उस प्रोग्राम पर वापस आ रहा हूं जिसमें मैं वास्तव में इसका उपयोग कर रहा हूं ...

अद्यतन सूची में निर्देशिकाओं को शामिल करने के लिए अतिरिक्त तर्क जोड़ा गया है या नहीं (अन्य तर्कों को याद रखने के लिए इसे उपयोग करने के लिए पारित करने की आवश्यकता होगी।) उदा।

$results = get_filelist_as_array($dir, true, '', true);


धन्यवाद, लेकिन यह फ़ंक्शन निर्देशिकाओं को सूचीबद्ध नहीं करता है। केवल फाइलें
डेनिज़ पोर्सुक

@DenizPorsuk अच्छा पिक, उस समय प्रश्न में याद किया जाना चाहिए। मैंने निर्देशिकाओं को शामिल करने के लिए एक वैकल्पिक तर्क जोड़ा है या नहीं। :-)
माजिक

2

इस समाधान ने मेरे लिए काम किया। RecursiveIteratorIterator सभी निर्देशिकाओं और फ़ाइलों को पुनरावर्ती रूप से लेकिन अनसोर्टेड सूचीबद्ध करता है। कार्यक्रम सूची को फ़िल्टर करता है और इसे सॉर्ट करता है।

मुझे यकीन है कि इस छोटे से लिखने का एक तरीका है; इसे सुधारने के लिए स्वतंत्र महसूस करें। यह सिर्फ एक कोड स्निपेट है। आप इसे अपने उद्देश्यों के लिए समेटना चाह सकते हैं।

<?php

$path = '/pth/to/your/directories/and/files';
// an unsorted array of dirs & files
$files_dirs = iterator_to_array( new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),RecursiveIteratorIterator::SELF_FIRST) );

echo '<html><body><pre>';
// create a new associative multi-dimensional array with dirs as keys and their files
$dirs_files = array();
foreach($files_dirs as $dir){
 if(is_dir($dir) AND preg_match('/\/\.$/',$dir)){
  $d = preg_replace('/\/\.$/','',$dir);
  $dirs_files[$d] = array();
  foreach($files_dirs as $file){
   if(is_file($file) AND $d == dirname($file)){
    $f = basename($file);
    $dirs_files[$d][] = $f;
   }
  }
 }
}
//print_r($dirs_files);

// sort dirs
ksort($dirs_files);

foreach($dirs_files as $dir => $files){
 $c = substr_count($dir,'/');
 echo  str_pad(' ',$c,' ', STR_PAD_LEFT)."$dir\n";
 // sort files
 asort($files);
 foreach($files as $file){
  echo str_pad(' ',$c,' ', STR_PAD_LEFT)."|_$file\n";
 }
}
echo '</pre></body></html>';

?>

2

@ A-312 के समाधान से स्मृति समस्याएं हो सकती हैं क्योंकि यह एक विशाल सरणी बना सकता है यदि /xampp/htdocs/WORK इसमें बहुत सारी फाइलें और फ़ोल्डर्स होने पर ।

यदि आपके पास PHP 7 है तो आप जेनरेटर का उपयोग कर सकते हैं और PHP की मेमोरी को इस तरह से ऑप्टिमाइज़ कर सकते हैं :

function getDirContents($dir) {
    $files = scandir($dir);
    foreach($files as $key => $value){

        $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
        if(!is_dir($path)) {
            yield $path;

        } else if($value != "." && $value != "..") {
           yield from getDirContents($path);
           yield $path;
        }
    }
}

foreach(getDirContents('/xampp/htdocs/WORK') as $value) {
    echo $value."\n";
}

से उपज


1

यह दी गई डायरेक्टरी में सभी फाइलों का पूरा रास्ता प्रिंट करेगा, आप अन्य कॉलबैक फ़ंक्शंस को पुनरावर्ती डीयर को भी पास कर सकते हैं।

function printFunc($path){
    echo $path."<br>";
}

function recursiveDir($path, $fileFunc, $dirFunc){
    $openDir = opendir($path);
    while (($file = readdir($openDir)) !== false) {
        $fullFilePath = realpath("$path/$file");
        if ($file[0] != ".") {
            if (is_file($fullFilePath)){
                if (is_callable($fileFunc)){
                    $fileFunc($fullFilePath);
                }
            } else {
                if (is_callable($dirFunc)){
                    $dirFunc($fullFilePath);
                }
                recursiveDir($fullFilePath, $fileFunc, $dirFunc);
            }
        }
    }
}

recursiveDir($dirToScan, 'printFunc', 'printFunc');

या:realpath("$path/$file");
ए -312

1

यह माजिक के उत्तर का थोड़ा संशोधन है ।
मैंने फ़ंक्शन द्वारा लौटी सरणी संरचना को बदल दिया है।

से:

array() => {
    [0] => "test/test.txt"
}

सेवा:

array() => {
    'test/test.txt' => "test.txt"
}

/**
 * @param string $dir
 * @param bool   $recursive
 * @param string $basedir
 *
 * @return array
 */
function getFileListAsArray(string $dir, bool $recursive = true, string $basedir = ''): array {
    if ($dir == '') {
        return array();
    } else {
        $results = array();
        $subresults = array();
    }
    if (!is_dir($dir)) {
        $dir = dirname($dir);
    } // so a files path can be sent
    if ($basedir == '') {
        $basedir = realpath($dir) . DIRECTORY_SEPARATOR;
    }

    $files = scandir($dir);
    foreach ($files as $key => $value) {
        if (($value != '.') && ($value != '..')) {
            $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
            if (is_dir($path)) { // do not combine with the next line or..
                if ($recursive) { // ..non-recursive list will include subdirs
                    $subdirresults = self::getFileListAsArray($path, $recursive, $basedir);
                    $results = array_merge($results, $subdirresults);
                }
            } else { // strip basedir and add to subarray to separate file list
                $subresults[str_replace($basedir, '', $path)] = $value;
            }
        }
    }
    // merge the subarray to give the list of files then subdirectory files
    if (count($subresults) > 0) {
        $results = array_merge($subresults, $results);
    }
    return $results;
}

मेरे जैसे सटीक अपेक्षित परिणाम वाले लोगों के लिए मदद कर सकते हैं।


1

जिनके लिए पहले फ़ोल्डरों की तुलना में सूची की आवश्यकता होती है (वर्णमाला पुराने के साथ)।

निम्नलिखित फ़ंक्शन का उपयोग कर सकते हैं। यह सेल्फ कॉलिंग फंक्शन नहीं है। तो आप निर्देशिका सूची, निर्देशिका दृश्य, फ़ाइलें सूची और फ़ोल्डर सूची अलग सरणी के रूप में भी होगा।

मैं इसके लिए दो दिन बिताता हूं और नहीं चाहता कि कोई इसके लिए अपना समय भी बर्बाद करे, आशा है कि इससे किसी की मदद हो।

function dirlist($dir){
    if(!file_exists($dir)){ return $dir.' does not exists'; }
    $list = array('path' => $dir, 'dirview' => array(), 'dirlist' => array(), 'files' => array(), 'folders' => array());

    $dirs = array($dir);
    while(null !== ($dir = array_pop($dirs))){
        if($dh = opendir($dir)){
            while(false !== ($file = readdir($dh))){
                if($file == '.' || $file == '..') continue;
                $path = $dir.DIRECTORY_SEPARATOR.$file;
                $list['dirlist_natural'][] = $path;
                if(is_dir($path)){
                    $list['dirview'][$dir]['folders'][] = $path;
                    // Bos klasorler while icerisine tekrar girmeyecektir. Klasorun oldugundan emin olalım.
                    if(!isset($list['dirview'][$path])){ $list['dirview'][$path] = array(); }
                    $dirs[] = $path;
                    //if($path == 'D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-content\upgrade'){ press($path); press($list['dirview']); die; }
                }
                else{
                    $list['dirview'][$dir]['files'][] = $path;
                }
            }
            closedir($dh);
        }
    }

    // if(!empty($dirlist['dirlist_natural']))  sort($dirlist['dirlist_natural'], SORT_LOCALE_STRING); // delete safe ama gerek kalmadı.

    if(!empty($list['dirview'])) ksort($list['dirview']);

    // Dosyaları dogru sıralama yaptırıyoruz. Deniz P. - info[at]netinial.com
    foreach($list['dirview'] as $path => $file){
        if(isset($file['files'])){
            $list['dirlist'][] = $path;
            $list['files'] = array_merge($list['files'], $file['files']);
            $list['dirlist'] = array_merge($list['dirlist'], $file['files']);
        }
        // Add empty folders to the list
        if(is_dir($path) && array_search($path, $list['dirlist']) === false){
            $list['dirlist'][] = $path;
        }
        if(isset($file['folders'])){
            $list['folders'] = array_merge($list['folders'], $file['folders']);
        }
    }

    //press(array_diff($list['dirlist_natural'], $list['dirlist'])); press($list['dirview']); die;

    return $list;
}

कुछ इस तरह उत्पादन होगा।

[D:\Xampp\htdocs\exclusiveyachtcharter.localhost] => Array
                (
                    [files] => Array
                        (
                            [0] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\.htaccess
                            [1] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\index.php
                            [2] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\license.txt
                            [3] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\php.php
                            [4] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\readme.html
                            [5] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-activate.php
                            [6] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-blog-header.php
                            [7] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-comments-post.php
                            [8] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-config-sample.php
                            [9] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-config.php
                            [10] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-cron.php
                            [11] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-links-opml.php
                            [12] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-load.php
                            [13] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-login.php
                            [14] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-mail.php
                            [15] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-settings.php
                            [16] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-signup.php
                            [17] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-trackback.php
                            [18] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\xmlrpc.php
                        )

                    [folders] => Array
                        (
                            [0] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\exclusiv_excluwlsql
                            [1] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-admin
                            [2] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-content
                            [3] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-includes
                        )

                )

dirview आउटपुट

    [dirview] => Array
        (
            [0] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\.htaccess
            [1] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\index.php
            [2] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\license.txt
            [3] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\php.php
            [4] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\readme.html
            [5] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-activate.php
            [6] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-blog-header.php
            [7] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-comments-post.php
            [8] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-config-sample.php
            [9] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-config.php
            [10] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-cron.php
            [11] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-links-opml.php
            [12] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-load.php
            [13] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-login.php
            [14] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-mail.php
            [15] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-settings.php
            [16] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-signup.php
            [17] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\wp-trackback.php
            [18] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\xmlrpc.php
            [19] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost
            [20] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\exclusiv_excluwlsql\exclusiv_excluwl.sql
            [21] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\exclusiv_excluwlsql\exclusiv_excluwl.sql.zip
            [22] => D:\Xampp\htdocs\exclusiveyachtcharter.localhost\exclusiv_excluwlsql
)

1

सापेक्ष पथ विकल्प जोड़ें:

function getDirContents($dir, $relativePath = false)
{
    $fileList = array();
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    foreach ($iterator as $file) {
        if ($file->isDir()) continue;
        $path = $file->getPathname();
        if ($relativePath) {
            $path = str_replace($dir, '', $path);
            $path = ltrim($path, '/\\');
        }
        $fileList[] = $path;
    }
    return $fileList;
}

print_r(getDirContents('/path/to/dir'));

print_r(getDirContents('/path/to/dir', true));

आउटपुट:

Array
(
    [0] => /path/to/dir/test1.html
    [1] => /path/to/dir/test.html
    [2] => /path/to/dir/index.php
)

Array
(
    [0] => test1.html
    [1] => test.html
    [2] => index.php
)

0

यह रहा मेरा :

function recScan( $mainDir, $allData = array() ) 
{ 
// hide files 
$hidefiles = array( 
".", 
"..", 
".htaccess", 
".htpasswd", 
"index.php", 
"php.ini", 
"error_log" ) ; 

//start reading directory 
$dirContent = scandir( $mainDir ) ; 

foreach ( $dirContent as $key => $content ) 
{ 
$path = $mainDir . '/' . $content ; 

// if is readable / file 
if ( ! in_array( $content, $hidefiles ) ) 
{ 
if ( is_file( $path ) && is_readable( $path ) ) 
{ 
$allData[] = $path ; 
} 

// if is readable / directory 
// Beware ! recursive scan eats ressources ! 
else 
if ( is_dir( $path ) && is_readable( $path ) ) 
{ 
/*recursive*/ 
$allData = recScan( $path, $allData ) ; 
} 
} 
} 

return $allData ; 
}  

0

यहाँ मैं उस के लिए उदाहरण है

एक निर्देशिका csv (फ़ाइल) में सभी फ़ाइलों और फ़ोल्डरों की सूची PHP पुनरावर्ती फ़ंक्शन के साथ पढ़ें

<?php

/** List all the files and folders in a Directory csv(file) read with PHP recursive function */
function getDirContents($dir, &$results = array()){
    $files = scandir($dir);

    foreach($files as $key => $value){
        $path = realpath($dir.DIRECTORY_SEPARATOR.$value);
        if(!is_dir($path)) {
            $results[] = $path;
        } else if($value != "." && $value != "..") {
            getDirContents($path, $results);
            //$results[] = $path;
        }
    }

    return $results;
}





$files = getDirContents('/xampp/htdocs/medifree/lab');//here folder name where your folders and it's csvfile;


foreach($files as $file){
$csv_file =$file;
$foldername =  explode(DIRECTORY_SEPARATOR,$file);
//using this get your folder name (explode your path);
print_r($foldername);

if (($handle = fopen($csv_file, "r")) !== FALSE) {

fgetcsv($handle); 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
for ($c=0; $c < $num; $c++) {
$col[$c] = $data[$c];
}
}
fclose($handle);
}

}

?>

http://myphpinformation.blogspot.in/2016/05/list-all-files-and-folders-in-directory-csv-file-read-with-php-recursive.html


0

परिणाम सरणी में फ़ोल्डर्स सहित बचने के लिए मैंने एक चेक पुनरावृत्ति के साथ हॉर्स सुजेट का अच्छा कोड सुधार लिया:

फ़ंक्शन getDirContents ($ dir, और $ परिणाम = सरणी ()) {

    $ फाइलें = स्कैंडिर ($ dir);

    foreach ($ फाइलें कुंजी के रूप में => $ मूल्य) {
        $ पथ = realpath ($ dir.DIRECTORY_SEPARATOR। $ मूल्य);
        अगर (is_dir ($ path) == false) {
            $ परिणाम [] = $ पथ;
        }
        और यदि ($ मूल्य! = ""। && $ मूल्य! = "..") {
            getDirContents ($ पथ, $ परिणाम);
            अगर (is_dir ($ path) == false) {
                $ परिणाम [] = $ पथ;
            }   
        }
    }
    $ परिणाम लौटाएँ;

}

0

सामान्य उपयोग के मामलों के लिए कॉपी और पेस्ट फ़ंक्शन के लिए तैयार, ऊपर दिए गए एक उत्तर के उन्नत / विस्तारित संस्करण :

function getDirContents(string $dir, int $onlyFiles = 0, string $excludeRegex = '~/\.git/~', int $maxDepth = -1): array {
    $results = [];
    $scanAll = scandir($dir);
    sort($scanAll);
    $scanDirs = []; $scanFiles = [];
    foreach($scanAll as $fName){
        if ($fName === '.' || $fName === '..') { continue; }
        $fPath = str_replace(DIRECTORY_SEPARATOR, '/', realpath($dir . '/' . $fName));
        if (strlen($excludeRegex) > 0 && preg_match($excludeRegex, $fPath . (is_dir($fPath) ? '/' : ''))) { continue; }
        if (is_dir($fPath)) {
            $scanDirs[] = $fPath;
        } elseif ($onlyFiles >= 0) {
            $scanFiles[] = $fPath;
        }
    }

    foreach ($scanDirs as $pDir) {
        if ($onlyFiles <= 0) {
            $results[] = $pDir;
        }
        if ($maxDepth !== 0) {
            foreach (getDirContents($pDir, $onlyFiles, $excludeRegex, $maxDepth - 1) as $p) {
                $results[] = $p;
            }
        }
    }
    foreach ($scanFiles as $p) {
        $results[] = $p;
    }

    return $results;
}

और अगर आपको सापेक्ष रास्तों की आवश्यकता है:

function updateKeysWithRelPath(array $paths, string $baseDir, bool $allowBaseDirPath = false): array {
    $results = [];
    $regex = '~^' . preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', realpath($baseDir)), '~') . '(?:/|$)~s';
    $regex = preg_replace('~/~', '/(?:(?!\.\.?/)(?:(?!/).)+/\.\.(?:/|$))?(?:\.(?:/|$))*', $regex); // limited to only one "/xx/../" expr
    if (DIRECTORY_SEPARATOR === '\\') {
        $regex = preg_replace('~/~', '[/\\\\\\\\]', $regex) . 'i';
    }
    foreach ($paths as $p) {
        $rel = preg_replace($regex, '', $p, 1);
        if ($rel === $p) {
            throw new \Exception('Path relativize failed, path "' . $p . '" is not within basedir "' . $baseDir . '".');
        } elseif ($rel === '') {
            if (!$allowBaseDirPath) {
                throw new \Exception('Path relativize failed, basedir path "' . $p . '" not allowed.');
            } else {
                $results[$rel] = './';
            }
        } else {
            $results[$rel] = $p;
        }
    }
    return $results;
}

function getDirContentsWithRelKeys(string $dir, int $onlyFiles = 0, string $excludeRegex = '~/\.git/~', int $maxDepth = -1): array {
    return updateKeysWithRelPath(getDirContents($dir, $onlyFiles, $excludeRegex, $maxDepth), $dir);
}

यह संस्करण हल / सुधार करता है:

  1. realpathजब PHP निर्देशिका को open_basedirकवर नहीं करता है तब से चेतावनी ..
  2. परिणाम सरणी के लिए संदर्भ का उपयोग नहीं करता है
  3. निर्देशिका और फ़ाइलों को बाहर करने की अनुमति देता है
  4. केवल फाइलों / निर्देशिकाओं को सूचीबद्ध करने की अनुमति देता है
  5. खोज की गहराई को सीमित करने की अनुमति देता है
  6. यह हमेशा डायरेक्टरी के साथ आउटपुट को सॉर्ट करता है (ताकि डायरेक्ट्रीज़ को रिवर्स ऑर्डर में हटाया / खाली किया जा सके)
  7. रिश्तेदार कुंजी के साथ पथ प्राप्त करने की अनुमति देता है
  8. हजारों या यहां तक ​​कि फाइलों के सैकड़ों के लिए भारी अनुकूलित
  9. टिप्पणियों में और अधिक के लिए लिखें :)

उदाहरण:

// list only `*.php` files and skip .git/ and the current file
$onlyPhpFilesExcludeRegex = '~/\.git/|(?<!/|\.php)$|^' . preg_quote(str_replace(DIRECTORY_SEPARATOR, '/', realpath(__FILE__)), '~') . '$~is';

$phpFiles = getDirContents(__DIR__, 1, $onlyPhpFilesExcludeRegex);
print_r($phpFiles);

// with relative keys
$phpFiles = getDirContentsWithRelKeys(__DIR__, 1, $onlyPhpFilesExcludeRegex);
print_r($phpFiles);

// with "include only" regex to include only .html and .txt files with "/*_mails/en/*.(html|txt)" path
'~/\.git/|^(?!.*/(|' . '[^/]+_mails/en/[^/]+\.(?:html|txt)' . ')$)~is'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.