복붙노트

PHP를 사용하여 디렉토리에있는 모든 폴더 하위 폴더와 파일 나열

PHP

PHP를 사용하여 디렉토리에있는 모든 폴더 하위 폴더와 파일 나열

나에게 PHP를 사용하여 디렉토리의 모든 폴더, 하위 폴더, 파일을 나열하는 솔루션을 제공하십시오. 내 폴더 구조는 다음과 같습니다.

Main Dir
 Dir1
  SubDir1
   File1
   File2
  SubDir2
   File3
   File4
 Dir2
  SubDir3
   File5
   File6
  SubDir4
   File7
   File8

각 폴더 안에있는 모든 파일의 목록을 가져오고 싶습니다.

PHP에서 쉘 스크립트 명령이 있습니까?

해결법

  1. ==============================

    1.

    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');
    
  2. ==============================

    2.이 코드는 모든 디렉토리와 파일을 트리 순서로 정렬 된 순서로 나열합니다. 모든 사이트 리소스에 대한 하이퍼 링크가 포함 된 사이트 맵 생성기입니다. 전체 웹 페이지 소스가 여기에 있습니다. 끝에서 9 번째 줄의 경로를 변경해야합니다.

    이 코드는 모든 디렉토리와 파일을 트리 순서로 정렬 된 순서로 나열합니다. 모든 사이트 리소스에 대한 하이퍼 링크가 포함 된 사이트 맵 생성기입니다. 전체 웹 페이지 소스가 여기에 있습니다. 끝에서 9 번째 줄의 경로를 변경해야합니다.

    <?php
    $pathLen = 0;
    
    function prePad($level)
    {
      $ss = "";
    
      for ($ii = 0;  $ii < $level;  $ii++)
      {
        $ss = $ss . "|&nbsp;&nbsp;";
      }
    
      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>
    
  3. ==============================

    3.디렉토리 Iterator를 사용하려는 경우

    디렉토리 Iterator를 사용하려는 경우

    다음 함수는 directoryIterator를 사용하여 @Shef answer를 다시 구현 한 것입니다.

    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');
    
  4. ==============================

    4.폴더 구조를 표시하는 아주 간단한 방법은 재귀 트리 반복자 클래스 (PHP 5> = 5.3.0, PHP 7)를 사용하고 ASCII 그래픽 트리를 생성합니다.

    폴더 구조를 표시하는 아주 간단한 방법은 재귀 트리 반복자 클래스 (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

    또한, 예를 들어 $ it-> setPrefixPart (RecursiveTreeIterator :: PREFIX_LEFT, "|")와 같이 Preurses를 RecursiveTreeIterator :: setPrefixPart를 사용하여 변경함으로써 트리의 ASCII 표현을 제어 할 수 있습니다.

  5. ==============================

    5.저는 SPL 라이브러리를 정말 좋아합니다. 그들은 RecursiveDirectoryIterator를 포함하여 반복자를 제공합니다.

    저는 SPL 라이브러리를 정말 좋아합니다. 그들은 RecursiveDirectoryIterator를 포함하여 반복자를 제공합니다.

  6. ==============================

    6.glob () 또는 재귀 적 디렉토리 반복자를 살펴보십시오.

    glob () 또는 재귀 적 디렉토리 반복자를 살펴보십시오.

  7. ==============================

    7.Skand () http : //www.hap.net/manual/en/function.skind.php

    Skand () http : //www.hap.net/manual/en/function.skind.php

  8. ==============================

    8.그것은 디렉터리 형식으로 메뉴 모음을 만드는 데 사용됩니다

    그것은 디렉터리 형식으로 메뉴 모음을 만드는 데 사용됩니다

    $pathLen = 0;
    
    function prePad($level)
    {
      $ss = "";
    
      for ($ii = 0;  $ii < $level;  $ii++)
      {
          $ss = $ss . "|&nbsp;&nbsp;";
        }
    
        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>
    
  9. ==============================

    9.

    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);         
        }
    

    }

  10. ==============================

    10.재귀 적 디렉토리 리스팅 솔루션을 찾고 다차원 배열로 정렬하십시오. 아래 코드를 사용하십시오.

    재귀 적 디렉토리 리스팅 솔루션을 찾고 다차원 배열로 정렬하십시오. 아래 코드를 사용하십시오.

    <?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>'
    
    ?>
    
  11. ==============================

    11.다음은 작업을 수행하는 scandir & array_filter가있는 간단한 함수입니다. 필터  regex를 사용하여 필요한 파일. 나는 지웠다 . ..htaccess와 같은 숨겨진 파일을 사용하면
      및 색상을 사용하여 출력을 사용자 정의하고 스캔 또는 빈 디렉토리가없는 경우 오류를 사용자 정의 할 수도 있습니다.

    다음은 작업을 수행하는 scandir & array_filter가있는 간단한 함수입니다. 필터  regex를 사용하여 필요한 파일. 나는 지웠다 . ..htaccess와 같은 숨겨진 파일을 사용하면

      및 색상을 사용하여 출력을 사용자 정의하고 스캔 또는 빈 디렉토리가없는 경우 오류를 사용자 정의 할 수도 있습니다.

      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');
      
    • ==============================

      12.다음을 시도해 볼 수도 있습니다.

      다음을 시도해 볼 수도 있습니다.

      <?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);
      ?>
      
    • ==============================

      13.

      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>';
      
    • ==============================

      14.쇼가 끝날 때까지 늦지 만, 받아 들인 답을 얻기 위해 ...

      쇼가 끝날 때까지 늦지 만, 받아 들인 답을 얻기 위해 ...

      모든 파일과 디렉토리를 배열로 가져 오려면 (자바 스크립트에서 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;
      }
      

      뉴비를 위해서 ...

      앞에서 언급 한 JSON.stringify를 사용하려면 JS / jQuery가 다음과 같아야합니다.

      var ajax = $.ajax({
          method: 'POST',
          data: {list_dirs: true}
      }).done(function(msg) {
          $('pre').html(
              'FILE LAYOUT<br/>' + 
                  JSON.stringify(JSON.parse(msg), null, 4)
          );
      });
      

      ^ 여기에 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를 수정하여 탭 (수직 파이프)을 표시하고 모든 키 값을 정렬하며 키의 따옴표를 제거하는 등 몇 가지 다른 작업을 수정했습니다. 업로드하거나 관심을 충분히 갖게되면이 답변을 링크로 수정합니다.

    • ==============================

      15.나는 이와 비슷한 기능을 찾고 있었다. 나는 단지 값으로 놓일 배열과 파일처럼 키와 서브 디렉토리로 디렉토리를 필요로했다. 다음 코드를 사용했습니다.

      나는 이와 비슷한 기능을 찾고 있었다. 나는 단지 값으로 놓일 배열과 파일처럼 키와 서브 디렉토리로 디렉토리를 필요로했다. 다음 코드를 사용했습니다.

      /**
       * 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 함수를 사용하여 모든 폴더 및 하위 폴더를 반복하고 연관 배열을 만듭니다. 여기서 폴더 이름은 키이고 파일은 값입니다 (폴더에 하위 폴더가없는 경우).

    from https://stackoverflow.com/questions/7121479/listing-all-the-folders-subfolders-and-files-in-a-directory-using-php by cc-by-sa and MIT license