我正在尝试创建一个扫描文件夹以查找子文件夹然后返回的函数 带有这些文件夹名称的数字数组。
这是我用于测试的代码。一旦我得到它打印出文件夹名称而不仅仅是“。”对于现在和上面的文件夹,“..”一切都会很好,我可以完成这个功能。
<?php
function super_l_getthemes($dir="themes")
{
if ($handle = opendir($dir)) {
echo "Handle: {$handle}\n";
echo "Files:\n";
while (false !== ($file = readdir($handle))) {
echo "{$file}<br>";
}
closedir($handle);
}
?>
上面的代码工作正常,并打印出文件夹的所有内容:文件,子文件夹和“。”和“..”
但如果我替换:
while (false !== ($file = readdir($handle))) {
echo "{$file}<br>";
}
使用:
while (false !== ($file = readdir($handle))) {
if(file_exists($file) && is_dir($file)){echo "{$file}";}
}
该功能仅打印“。”和“..”,而不是我想要打印的两个文件夹名称。
感谢任何帮助。
答案 0 :(得分:6)
您必须提供file_exists
的绝对路径,否则它将在当前执行路径中查找它。
while (false !== ($file = readdir($handle))) {
$file_path = $dir . DIRECTORY_SEPARATOR . $file;
if (file_exists($file_path) && is_dir($file_path)) {
echo "{$file}";
}
}
答案 1 :(得分:3)
readdir
的问题是它只读取目录中命名条目的字符串。
例如,如果你在目录“/ path / to / files /”中有文件“foo”,那么当在“/ path / to / files /”上使用readdir
时,你最终会来到字符串“foo”。
通常,如果它与脚本的当前工作目录位于同一目录中,则不会出现问题,但是,因为您正在从任意控制器读取,所以当您尝试检查该条目时(文件,目录) ,无论如何),你在裸字符串“foo”上调用is_dir
。
我会尝试使用readdir
为您提取的名称添加前缀,并附上文件路径。
if ($handle = opendir($dir)) {
echo "Handle: {$handle}\n";
echo "Files:\n";
while ($file = readdir($handle)) {
/*** make $file into an absolute path ***/
$absolute_path = $dir . '/' . $file;
/*** NOW try stat'ing it ***/
if (is_dir($absolute_path)) {
/* it's a directory; do stuff */
}
}
closedir($handle);
}
答案 2 :(得分:1)
您需要使用:
while (false !== ($file = readdir($handle))) {
if(file_exists($dir.'/'.$file) && is_dir($dir.'/'.$file)){echo "{$file}";}
}
答案 3 :(得分:1)
如果您只想要起始文件夹的目录,只需执行以下操作:
glob('/some/path/to/search/in/*', GLOB_ONLYDIR);
它只会给你一个数组中的那些foldernames。如果您希望所有目录低于给定路径,请尝试SPL's RecursiveDirectoryIterator
$fileSystemIterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/some/path/to/look/in'),
RecursiveIteratorIterator::SELF_FIRST);
迭代器可以与foreach
一起使用:
$directories = array();
foreach($fileSystemIterator as $path => $fileSystemObject) {
if($fileSystemObject->isDir()) {
$directories[] = $path;
}
}
然后,您将拥有一个数组$directories
,其中包含给定路径下的所有目录。
答案 4 :(得分:0)
我认为您不需要file_exists
和is_dir
,
您只需要is_dir
功能。从手册:
is_dir
如果文件名存在且为目录,则返回TRUE,否则返回FALSE。
使用此:
while (false !== ($file = readdir($handle))) {
if(is_dir($file)){echo "{$file}";}
}
is_dir
还会检查它是相对路径还是绝对路径。
答案 5 :(得分:0)
$files = array();
foreach(new DirectoryIteraror('/path') as $file){
if($file->isDir() /* && !$file->isDot()*/) $files[] = $file->getFilename();
}
[编辑:虽然你想跳过点,然后评论出来)
答案 6 :(得分:0)
$directory = scandir($path);
foreach($directory as $a){
if(is_dir($path.$a.'/') && $a != '.' && $a != '..'){
echo $a.'<br/>';
}
}
如图所示给出路径,它显示路径中存在的文件夹。
答案 7 :(得分:-2)
我同意nuqqsa的解决方案,但是,我想补充一些内容。
您可以改为更改当前目录,而不是指定路径。
例如,
// open directory handle
// ....
chdir($dir);
while (false !== ($file = readdir($handle)))
if(is_dir($file))
echo $file;
// close directory handle