PHP를 사용하여 디렉토리의 모든 폴더 하위 폴더 및 파일 프로그램
php를 사용하여 디렉토리의 모든 폴더, 하위 폴더, 파일을 설치하는 솔루션을 제공하십시오. 내 폴더 구조는 다음과 달라집니다.
Main Dir
Dir1
SubDir1
File1
File2
SubDir2
File3
File4
Dir2
SubDir3
File5
File6
SubDir4
File7
File8
각 폴더 내의 모든 파일 목록을 싶습니다.
PHP에 쉘 어디에 있습니까?
function listFolderFiles($dir){
$ffs = scandir($dir);
unset($ffs[array_search('.', $ffs, true)]);
unset($ffs[array_search('..', $ffs, true)]);
// prevent empty ordered elements
if (count($ffs) < 1)
return;
echo '<ol>';
foreach($ffs as $ff){
echo '<li>'.$ff;
if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff);
echo '</li>';
}
echo '</ol>';
}
listFolderFiles('Main Dir');
이 코드는 모든 디렉터리와 파일을 트리보기에 정렬 된 순서로 지시합니다. 모든 사이트 리소스에 대한 하이퍼 링크가있는 사이트 맵 생성기입니다. 전체 웹 페이지 소스는 여기에 있습니다. 끝에서 아홉 번째 줄의 경로를 변경해야합니다.
<?php
$pathLen = 0;
function prePad($level)
{
$ss = "";
for ($ii = 0; $ii < $level; $ii++)
{
$ss = $ss . "| ";
}
return $ss;
}
function myScanDir($dir, $level, $rootLen)
{
global $pathLen;
if ($handle = opendir($dir)) {
$allFiles = array();
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
if (is_dir($dir . "/" . $entry))
{
$allFiles[] = "D: " . $dir . "/" . $entry;
}
else
{
$allFiles[] = "F: " . $dir . "/" . $entry;
}
}
}
closedir($handle);
natsort($allFiles);
foreach($allFiles as $value)
{
$displayName = substr($value, $rootLen + 4);
$fileName = substr($value, 3);
$linkName = str_replace(" ", "%20", substr($value, $pathLen + 3));
if (is_dir($fileName)) {
echo prePad($level) . $linkName . "<br>\n";
myScanDir($fileName, $level + 1, strlen($fileName));
} else {
echo prePad($level) . "<a href=\"" . $linkName . "\" style=\"text-decoration:none;\">" . $displayName . "</a><br>\n";
}
}
}
}
?><!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Site Map</title>
</head>
<body>
<h1>Site Map</h1>
<p style="font-family:'Courier New', Courier, monospace; font-size:small;">
<?php
$root = '/home/someuser/www/website.com/public';
$pathLen = strlen($root);
myScanDir($root, 0, strlen($root)); ?>
</p>
</body>
</html>
폴더 구조를 사용하여 아주 간단한 방법은 RecursiveTreeIterator
클래스 (PHP 5> = 5.3.0, PHP 7)를 ASCII 그래픽 트리를 생성합니다.
$it = new RecursiveTreeIterator(new RecursiveDirectoryIterator("/path/to/dir", RecursiveDirectoryIterator::SKIP_DOTS));
foreach($it as $path) {
echo $path."<br>";
}
http://php.net/manual/en/class.recursivetreeiterator.php
RecursiveTreeIterator::setPrefixPart
예를 들어를 사용하여 접두사를 변경하여 트리의 ASCII 표현을 제어 할 수도 있습니다.$it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, "|");
사용하고 싶은 경우 directoryIterator
다음 기능은 @Shef 답변을 다음과 같이 다시 구현 한 것입니다. directoryIterator
function listFolderFiles($dir)
{
echo '<ol>';
foreach (new DirectoryIterator($dir) as $fileInfo) {
if (!$fileInfo->isDot()) {
echo '<li>' . $fileInfo->getFilename();
if ($fileInfo->isDir()) {
listFolderFiles($fileInfo->getPathname());
}
echo '</li>';
}
}
echo '</ol>';
}
listFolderFiles('Main Dir');
저는 SPL 라이브러리를 정말 좋아하며 RecursiveDirectoryIterator를 포함 하여 반복적으로 제공합니다 .
() glob에 또는 재귀 디렉토리 반복자를 살펴보십시오 .
scandir()
http://php.net/manual/en/function.scandir.php
메뉴 모음을 디렉토리 형식으로 만드는 데 사용됩니다.
$pathLen = 0;
function prePad($level)
{
$ss = "";
for ($ii = 0; $ii < $level; $ii++)
{
$ss = $ss . "| ";
}
return $ss;
}
function myScanDir($dir, $level, $rootLen)
{
global $pathLen;
if ($handle = opendir($dir)) {
$allFiles = array();
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
if (is_dir($dir . "/" . $entry))
{
$allFiles[] = "D: " . $dir . "/" . $entry;
}
else
{
$allFiles[] = "F: " . $dir . "/" . $entry;
}
}
}
closedir($handle);
natsort($allFiles);
foreach($allFiles as $value)
{
$displayName = substr($value, $rootLen + 4);
$fileName = substr($value, 3);
$linkName = str_replace(" ", " ", substr($value, $pathLen + 3));
if (is_dir($fileName))
{
echo "<li ><a class='dropdown'><span>" . $displayName . " </span></a><ul>";
myScanDir($fileName, $level + 1, strlen($fileName));
echo "</ul></li>";
}
else {
$newstring = substr($displayName, -3);
if($newstring == "PDF" || $newstring == "pdf" )
echo "<li ><a href=\"" . $linkName . "\" style=\"text-decoration:none;\">" . $displayName . "</a></li>";
}
$t;
if($level != 0)
{
if($level < $t)
{
$r = int($t) - int($level);
for($i=0;$i<$r;$i++)
{
echo "</ul></li>";
}
}
}
$t = $level;
}
}
}
?>
<li style="color: #ffffff">
<?php
// ListFolder('D:\PDF');
$root = 'D:\PDF';
$pathLen = strlen($root);
myScanDir($root, 0, strlen($root));
?>
</li>
재귀 디렉토리 목록 솔루션을 찾고 다차원 배열로 배열하는 경우. 아래 코드를 사용하십시오.
<?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>'
?>
다음은 scandir
& array_filter
를 사용 하는 간단한 기능입니다 . 정규식을 사용하여 필요한 파일을 필터링하십시오. , .
..
와 같은 숨겨진 파일을 제거 하고 (를) .htaccess
사용하여 출력을 사용자 정의 할 수도 <ul>
있고 스캔이 디렉토리가 비어있는 경우 오류를 사용자 정의 할 수도 있습니다 !.
function getAllContentOfLocation($loc)
{
$scandir = scandir($loc);
$scandir = array_filter($scandir, function($element){
return !preg_match('/^\./', $element);
});
if(empty($scandir)) echo '<li style="color:red">Empty Dir</li>';
foreach($scandir as $file){
$baseLink = $loc . DIRECTORY_SEPARATOR . $file;
echo '<ol>';
if(is_dir($baseLink))
{
echo '<li style="font-weight:bold;color:blue">'.$file.'</li>';
getAllContentOfLocation($baseLink);
}else{
echo '<li>'.$file.'</li>';
}
echo '</ol>';
}
}
//Call function and set location that you want to scan
getAllContentOfLocation('../app');
function GetDir($dir) {
if (is_dir($dir)) {
if ($kami = opendir($dir)) {
while ($file = readdir($kami)) {
if ($file != '.' && $file != '..') {
if (is_dir($dir . $file)) {
echo $dir . $file;
// since it is a directory we recurse it.
GetDir($dir . $file . '/');
} else {
echo $dir . $file;
}
}
}
}
closedir($kami);
}
}
다음을 시도해 볼 수도 있습니다.
<?php
function listdirs($dir) {
static $alldirs = array();
$dirs = glob($dir . '/*', GLOB_ONLYDIR);
if (count($dirs) > 0) {
foreach ($dirs as $d) $alldirs[] = $d;
}
foreach ($dirs as $dir) listdirs($dir);
return $alldirs;
}
$directory_list = listdirs('xampp');
print_r($directory_list);
?>
define ('PATH', $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF']));
$dir = new DirectoryIterator(PATH);
echo '<ul>';
foreach ($dir as $fileinfo)
{
if (!$fileinfo->isDot()) {
echo '<li><a href="'.$fileinfo->getFilename().'" target="_blank">'.$fileinfo->getFilename().'</a></li>';
echo '</li>';
}
}
echo '</ul>';
쇼에 늦었지만 수용된 답변을 바탕으로 ...
모든 파일과 디렉토리를 배열로 가지고있는 파일 ( JavaScript의 JSON.stringify 로 멋지게 꾸밀 수 있음 ) 함수를 다음과 같이 배치 할 수 있습니다.
function listFolderFiles($dir) {
$arr = array();
$ffs = scandir($dir);
foreach($ffs as $ff) {
if($ff != '.' && $ff != '..') {
$arr[$ff] = array();
if(is_dir($dir.'/'.$ff)) {
$arr[$ff] = listFolderFiles($dir.'/'.$ff);
}
}
}
return $arr;
}
모두를 위해 ...
언급 된 참조 한을 사용하는 비용 JS / jQuery는 다음과 가변적 JSON.stringify
입니다.
var ajax = $.ajax({
method: 'POST',
data: {list_dirs: true}
}).done(function(msg) {
$('pre').html(
'FILE LAYOUT<br/>' +
JSON.stringify(JSON.parse(msg), null, 4)
);
});
^ 이것은 <pre>
HTML 어딘가에 요소 가있는 가정합니다 . AJAX의 어떤 맛이든 가능하지만 대부분의 사람들이 위의 jQuery와 사용할 것을 사용하고 생각합니다.
그리고 함께 제공되는 PHP :
if(isset($_POST['list_dirs'])) {
echo json_encode(listFolderFiles($rootPath));
exit();
}
listFolderFiles
이전에 이미 가지고있는 곳 .
제 경우 $rootPath
에는 사이트의 루트 디렉토리로 설정했습니다.
$rootPath;
if(!isset($rootPath)) {
$rootPath = $_SERVER['DOCUMENT_ROOT'];
}
최종 결과는 다음과 가변적입니다.
| some_file_1487.smthng []
| some_file_8752.smthng []
| CSS
| | some_file_3615.smthng []
| | some_file_8151.smthng []
| | some_file_7571.smthng []
| | some_file_5641.smthng []
| | some_file_7305.smthng []
| | some_file_9527.smthng []
|
| IMAGES
| | some_file_4515.smthng []
| | some_file_1335.smthng []
| | some_file_1819.smthng []
| | some_file_9188.smthng []
| | some_file_4760.smthng []
| | some_file_7347.smthng []
|
| JSScripts
| | some_file_6449.smthng []
| | some_file_7864.smthng []
| | some_file_3899.smthng []
| | google-code-prettify
| | | some_file_2090.smthng []
| | | some_file_5169.smthng []
| | | some_file_3426.smthng []
| | | some_file_8208.smthng []
| | | some_file_7581.smthng []
| | | some_file_4618.smthng []
| |
| | some_file_3883.smthng []
| | some_file_3713.smthng []
... and so on...
참고 : 귀하의 항목은 이와 일치하지 않을 것입니다. JSON.stringify
탭 (수직 파이프)을 표시하고, 모든 키 값을 정렬하고, 키에서 따옴표를 제거하는 등 몇 가지 다른 사항을 수정했습니다. 이 답변을 업로드하거나 충분한 관심을 얻면 링크로 수정하겠습니다.
이 게시물은 Shef (정답을 올린 사람)를위한 것입니다. 그것이 내가 그의 코드에 대해 얼마나 감사하고 내가 그 코드로 무엇을했는지 보여줄 수있는 유일한 방법입니다.
<!DOCTYPE html>
<head><title>Displays Folder Contents</title></head>
<?php
function frmtFolder($Entity){
echo '<li style="font-weight:bold;color:black;list-style-type:none">' . $Entity;
}
function frmtFile($dEntry, $fEntry){
echo '<li style="list-style-type:square">' . '<a href="' . $dEntry . '/' . $fEntry .
'"> ' . $fEntry . ' </a>';
}
function listFolderFiles($dir) {
$ffs = scandir($dir);
unset($ffs[array_search('.', $ffs, true)]);
unset($ffs[array_search('..', $ffs, true)]);
unset($ffs[array_search('index.html', $ffs, true)]);
// prevent empty ordered elements
if (count($ffs) < 1) {return;}
echo '<ul>';
foreach ($ffs as $ff) {
if (is_dir($dir . '/' . $ff)) {
frmtFolder($dir);
} else {
frmtFile($dir, $ff);
}
if (is_dir($dir . '/' . $ff)) {
listFolderFiles($dir . '/' . $ff);
}
echo '</li>';
}
echo '</ul>';
}
listFolderFiles('Folder_To_List_Here');
앞으로 frmtFile을 확장하여 오디오 및 비디오 태그를 사용할 계획입니다.
선례 답변이 내 요구를 궁금해합니다.
당신이 원하는 경우 하나의 평면 배열에있는 모든 파일과 디렉토리들은 ,이 기능 (찾을 수 있습니다 여기를 )
// Does not support flag GLOB_BRACE
function glob_recursive($pattern, $flags = 0) {
$files = glob($pattern, $flags);
foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) {
$files = array_merge($files, glob_recursive($dir.'/'.basename($pattern), $flags));
}
return $files;
}
나의 경우에는 :
$paths = glob_recursive(os_path_join($base_path, $current_directory, "*"));
다음과 같은 배열을 반환합니다.
[
'/home/dir',
'/home/dir/image.png',
'/home/dir/subdir',
'/home/dir/subdir/file.php',
]
동적 경로 생성을 사용할 수 있습니다.
$paths = glob_recursive(os_path_join($base_path, $directory, "*"));
이 기능으로 :
function os_path_join(...$parts) {
return preg_replace('#'.DIRECTORY_SEPARATOR.'+#', DIRECTORY_SEPARATOR, implode(DIRECTORY_SEPARATOR, array_filter($parts)));
}
디렉토리 만 얻으려면 다음을 사용할 수 있습니다.
$paths = glob_recursive(os_path_join($base_path, $current_directory, "*"));
$subdirs = array_filter($paths, function($path) {
return is_dir($path);
});
나는 이것과 기능을 찾고 있었다. 키로 디렉토리가 필요하고 값으로 배치되는 배열과 파일로 하위 디렉토리가 필요했습니다.
다음 코드를 사용했습니다.
/**
* Return an array of files found within a specified directory.
* @param string $dir A valid directory. If a path, with a file at the end,
* is passed, then the file is trimmed from the directory.
* @param string $regex Optional. If passed, all file names will be checked
* against the expression, and only those that match will
* be returned.
* A RegEx can be just a string, where a '/' will be
* prefixed and a '/i' will be suffixed. Alternatively,
* a string could be a valid RegEx string.
* @return array An array of all files from that directory. If regex is
* set, then this will be an array of any matching files.
*/
function get_files_in_dir(string $dir, $regex = null)
{
$dir = is_dir($dir) ? $dir : dirname($dir);
// A RegEx to check whether a RegEx is a valid RegEx :D
$pass = preg_match("/^([^\\\\a-z ]).+([^\\\\a-z ])[a-z]*$/i", $regex, $matches);
// Any non-regex string will be caught here.
if (isset($regex) && !$pass) {
//$regex = '/'.addslashes($regex).'/i';
$regex = "/$regex/i";
}
// A valid regex delimiter with different delimiters will be caught here.
if (!empty($matches) && $matches[1] !== $matches[2]) {
$regex .= $matches[1] . 'i'; // Append first delimiter and i flag
}
try {
$files = scandir($dir);
} catch (Exception $ex) {
$files = ['.', '..'];
}
$files = array_slice($files, 2); // Remove '.' and '..'
$files = array_reduce($files, function($carry, $item) use ($regex) {
if ((!empty($regex) && preg_match($regex, $item)) || empty($regex)) {
array_push($carry, $item);
}
return $carry;
}, []);
return $files;
}
function str_finish($value, $cap)
{
$quoted = preg_quote($cap, '/');
return preg_replace('/(?:'.$quoted.')+$/u', '', $value).$cap;
}
function get_directory_tree($dir)
{
$fs = get_files_in_dir($dir);
$files = array();
foreach ($fs as $k => $f) {
if (is_dir(str_finish($dir, '/').$f)) {
$fs[$f] = get_directory_tree(str_finish($dir, '/').$f);
} else {
$files[] = $f;
}
unset($fs[$k]);
}
$fs = array_merge($fs, $files);
return $fs;
}
받아 들일 것입니다.
첫 번째 함수 get_files_in_dir
함수는 정규식을 기반으로 디렉토리의 모든 파일과 폴더를 가져올 수 있도록 생성되었습니다. 디렉토리가 배열로 변환되었는지 확인하기 위해 오류 검사가 있기 때문에 여기에서 사용합니다.
다음으로, 우리는 문자열 끝에 슬래시가 없다면 슬래시를 추가하는 간단한 함수가 있습니다.
마지막으로 get_directory_tree
모든 폴더와 하위 폴더를 반복하고 폴더 이름이 키이고 파일이 값인 연관 배열을 만드는 기능이 있습니다 (폴더에 하위 폴더가없는 경우).
'ProgramingTip' 카테고리의 다른 글
Android에서 알림의 가운데 텍스트 (0) | 2020.12.31 |
---|---|
비트 XOR (배타적 OR)은 무엇을 의미합니까? (0) | 2020.12.31 |
자바 스크립트 : 배열로 주어진 객체 이름을 사용하여 중첩 된 객체를 동적으로 만드는 방법 (0) | 2020.12.31 |
쿠키 PHP의 배열 (0) | 2020.12.31 |
웹용 Visual Studio Express 2013에서 JSON 파일로드 허용 (0) | 2020.12.31 |