मैं फ़ाइलों के बिना दिए गए निर्देशिका के सभी उप-निर्देशिकाओं को कैसे प्राप्त कर सकता हूं, .
(वर्तमान निर्देशिका) या ..
(मूल निर्देशिका) और फिर किसी फ़ंक्शन में प्रत्येक निर्देशिका का उपयोग कर सकता हूं ?
मैं फ़ाइलों के बिना दिए गए निर्देशिका के सभी उप-निर्देशिकाओं को कैसे प्राप्त कर सकता हूं, .
(वर्तमान निर्देशिका) या ..
(मूल निर्देशिका) और फिर किसी फ़ंक्शन में प्रत्येक निर्देशिका का उपयोग कर सकता हूं ?
जवाबों:
आप विकल्प के साथ ग्लोब () का उपयोग कर सकते हैंGLOB_ONLYDIR
या
$dirs = array_filter(glob('*'), 'is_dir');
print_r( $dirs);
यहां बताया गया है कि आप GLOB के साथ केवल निर्देशिका कैसे प्राप्त कर सकते हैं:
$directories = glob($somePath . '/*' , GLOB_ONLYDIR);
$somePath
आउटपुट में पथ भी शामिल है
Spl DirectoryIterator वर्ग फ़ाइल सिस्टम निर्देशिकाओं की सामग्री को देखने के लिए एक सरल इंटरफ़ेस प्रदान करता है।
$dir = new DirectoryIterator($path);
foreach ($dir as $fileinfo) {
if ($fileinfo->isDir() && !$fileinfo->isDot()) {
echo $fileinfo->getFilename().'<br>';
}
}
आपके पिछले प्रश्न के समान ही :
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($yourStartingPath),
RecursiveIteratorIterator::SELF_FIRST);
foreach($iterator as $file) {
if($file->isDir()) {
echo strtoupper($file->getRealpath()), PHP_EOL;
}
}
strtoupper
अपने इच्छित कार्य से बदलें ।
getFilename()
केवल निर्देशिका नाम लौटाएगा।
RecursiveDirectoryIterator::SKIP_DOTS
दूसरे तर्क के रूप में जोड़ना था RecursiveDirectoryIterator
।
इस कोड को आज़माएं:
<?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;
ऐरे में:
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
<?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
*/
?>
आप इस फ़ंक्शन को आज़मा सकते हैं (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;
}
सही तरीका
/**
* 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);
});
}
लारवेल से प्रेरित
GLOB_ONLYDIR
, तो overkill देखें php.net/manual/en/function.glob.php
एकमात्र प्रश्न जो प्रत्यक्ष ने पूछा है, उसे गलती से बंद कर दिया गया है, इसलिए मुझे इसे यहाँ रखना होगा।
यह निर्देशिकाओं को फ़िल्टर करने की क्षमता भी देता है।
/**
* 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;
}
आप ऐसा करने के लिए ग्लोब () फ़ंक्शन का उपयोग कर सकते हैं।
यहाँ इस पर कुछ प्रलेखन है: http://php.net/manual/en/function.glob.php
सभी 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;
}
यदि आप एक पुनरावर्ती निर्देशिका लिस्टिंग समाधान की तलाश कर रहे हैं। नीचे दिए गए कोड का उपयोग करें मुझे आशा है कि यह आपकी मदद करेगा।
<?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>'
?>
निम्न पुनरावर्ती फ़ंक्शन उप निर्देशिकाओं की पूरी सूची के साथ एक सरणी देता है
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/
एक निर्दिष्ट निर्देशिका के तहत सभी फ़ाइलों और फ़ोल्डरों का पता लगाएं।
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)