code.fastix.org

Dateiansicht:

Datei:Projekte -> PHP:class Dir2Array -> Dir2Array.class.php
md5:3eacd52da22035cc3185a426b5bd3423
sha1:95bdd33f63b032d1528f9c5a138df07bfafe7933
  1. <?php
  2. /**
  3.  * @author: Jörg Reinholz, fastix WebDesign & Consult, Kassel - http://www.fastix.org/
  4.  * @return: array
  5.  * @see: phpdoc functions opendir, readdir, sort, date
  6.  * @uses: humanReadableBin.php, sort_2D_hash.php
  7. **/
  8.  
  9. require_once './lib/humanReadableBin.php';
  10. require_once './lib/sort_2D_hash.php';
  11.  
  12. class Dir2Array
  13. {
  14.     protected   $DH              = false;
  15.     protected   $dir             = false;
  16.     private     $sortItem        = 'name';
  17.     private     $sortUpDown      = 'up';
  18.     private     $sortOrder       = SORT_REGULAR;
  19.     private     $foldersFirst    = 0;
  20.     private     $showHiddenFiles = 0;
  21.     private     $showDirLinks    = 0;
  22.     private     $arIgnoreFilesRegex = array();
  23.     private     $errors = false;
  24.     public      $filetimemHumanStyle = 'Y-m-d H:i'; # the same format like in date()
  25.  
  26.     public function __construct ( $dir = false ) {
  27.  
  28.         $dir = realpath($dir);
  29.  
  30.         if (! $dir) {
  31.             trigger_error(__FILE__ . ' class Dir2Array: Es wurde kein existierendes Verzeichnis übergeben.', E_USER_ERROR);
  32.             setError (1, E_USER_ERROR, 'Es wurde kein existierendes Verzeichnis angebeben.');
  33.             return false;
  34.         }
  35.  
  36.         if (! is_dir($dir)) {
  37.             trigger_error(__FILE__ . ' class Dir2Array: Das Verzeichnis "' . $dir . '" existiert nicht.', E_USER_NOTICE);
  38.             setError (2, E_USER_ERROR, 'Das Verzeichnis "' . $dir . '" existiert nicht.');
  39.             return false;
  40.         }
  41.  
  42.         if (! is_readable($dir)) {
  43.             trigger_error(__FILE__ . '  class Dir2Array: Das Verzeichnis "' . $dir . '" ist nicht lesbar.', E_USER_NOTICE);
  44.             setError (4, E_USER_ERROR, 'Das Verzeichnis "' . $dir . '" ist nicht lesbar.');
  45.             return false;
  46.         }
  47.  
  48.  
  49.  
  50.         $this -> sortOrder        = ( SORT_NATURAL | SORT_FLAG_CASE );
  51.         $this -> showFoldersFirst = true;
  52.         $this -> showHiddenFiles  = false;
  53.         $this -> showDirLinks     = false;
  54.         $this -> DH = opendir($dir);
  55.         $this -> dir = $dir;
  56.         $this -> arIgnoreFilesRegex[0] = '/\.projekte_dir_cache/';
  57.         return true;
  58.     }
  59.  
  60.  
  61.     private function setError ($errorNumber, $ErrorType, $ErrorString) {
  62.         $arErrors = $this -> errors;
  63.         if (! $arError) {
  64.             $errIndex=0;
  65.         } else {
  66.             $newErrorIndex = count($arError);
  67.             $arErrors[$newErrorIndex]['ErrorNumber']=$errorNumber;
  68.             $arErrors[$newErrorIndex]['ErrorType']=$errorType;
  69.             $arErrors[$newErrorIndex]['ErrorString']=$errorString;
  70.         }
  71.         $this -> errors = $arErrors;
  72.     }
  73.  
  74.     public function getErrors () {
  75.         return $this -> errors;
  76.     }
  77.  
  78.     public function getRealDir () {
  79.         return $this -> dir;
  80.     }
  81.  
  82.  
  83.     public function setSortItem($sortItem) {
  84.  
  85.     $arGueltige = array(
  86.             'name',
  87.             'time',
  88.             'size',
  89.             'mime'
  90.         );
  91.         if (! in_array($sortItem, $arGueltige) ) {
  92.             trigger_error(__FILE__ . 'class Dir2Array: sorItem() wurde eine ungültiges SortItem übergeben', E_USER_NOTICE);
  93.             setError (8, E_USER_NOTICE, 'class Dir2Array: sortItem() wurde ein ungültiger Wert übergeben.  Die Aktion wird ignoriert.');
  94.             return false;
  95.         } else {
  96.             $this -> sortItem = $sortItem;
  97.             return true;
  98.         }
  99.     }
  100.  
  101.     public function setSortOrder($sortOrder) {
  102.         if (! is_int($sortOrder)) {
  103.             trigger_error(__FILE__ . 'class Dir2Array: sortOrder() wurde ein nichtnumerischer Wert übergeben', E_USER_NOTICE);
  104.             setError (16, E_USER_NOTICE, 'sortOrder() wurde ein nichtnumerischer Wert übergeben. Die Aktion wird ignoriert.');
  105.             return false;
  106.         }
  107.  
  108.         $arGueltige = array(
  109.             SORT_REGULAR,
  110.             SORT_NUMERIC,
  111.             SORT_STRING,
  112.             SORT_LOCALE_STRING,
  113.             SORT_NATURAL,
  114.             ( SORT_STRING | SORT_FLAG_CASE ),
  115.             ( SORT_NATURAL | SORT_FLAG_CASE )
  116.         );
  117.  
  118.         if (! in_array($sortOrder, $arGueltige) ) {
  119.             trigger_error(__FILE__ . 'class Dir2Array: sortOrder() wurde eine ungültige SortOrder übergeben', E_USER_NOTICE);
  120.             setError (32, E_USER_NOTICE, 'class Dir2Array: sortOrder() wurde ein ungültiger Wert übergeben.  Die Aktion wird ignoriert.');
  121.             return false;
  122.         } else {
  123.             $this -> sortOrder = $sortOrder;
  124.             return true;
  125.         }
  126.     }
  127.  
  128.     public function setUpDown ($v) {
  129.         $v = strtolower($v);
  130.         if ('up' == $v or 'down' == $v) {
  131.             $this -> sortUpDown = $v;
  132.             return true;
  133.         } else {
  134.             trigger_error(__FILE__ . 'class Dir2Array: setUpDown wurde ein ungültiger Wert ('.$v.') übergeben. Gültig ist "up" oder "down". Die Aktion wird ignoriert.', E_USER_NOTICE);
  135.             setError (32, E_USER_NOTICE, 'class Dir2Array: setUpDown wurde ein ungültiger Wert ('.$v.') übergeben. Gültig ist "up" oder "down". Die Aktion wird ignoriert.');
  136.             return false;
  137.         }
  138.     }
  139.     public function setShowFoldersFirst($v) {
  140.         $this -> showFoldersFirst = $v;
  141.         return true;
  142.     }
  143.  
  144.     public function setShowHiddenFiles($v) {
  145.         $this -> showHiddenFiles = $v;
  146.         return true;
  147.     }
  148.  
  149.     public function setShowDirLinks($v) {
  150.         $this -> showDirLinks = $v;
  151.         return true;
  152.     }
  153.  
  154.     public function addIgnoreFilesRegex($v) {
  155.         $ar = $this -> arIgnoreFilesRegex;
  156.         $ar[] = $v;
  157.         $this -> arIgnoreFilesRegex = $ar;
  158.         return true;
  159.     }
  160.  
  161.     public function removeIgnoreFilesRegex($v) {
  162.         $ar = $this -> arIgnoreFilesRegex;
  163.         if ( in_array ($v, $ar) ) {
  164.             $ar2 = array();
  165.             foreach ($ar as $s) {
  166.                 if ($s != $v) { $ar2[] = $s; }
  167.             }
  168.             $this -> arIgnoreFilesRegex = $ar2;
  169.             return true;
  170.         } else {
  171.             return false;
  172.         }
  173.     }
  174.  
  175.     public function getArray() {
  176.  
  177.         $cacheName =
  178.               '.projekte_dir_cache/' . ','
  179.             . $this -> sortItem . ','
  180.             . $this -> sortUpDown . ','
  181.             . $this -> sortOrder . ','
  182.             . $this -> foldersFirst . ','
  183.             . $this -> showHiddenFiles . ','
  184.             . $this -> showDirLinks . ','
  185.             . $this -> filetimemHumanStyle . ','
  186.             . 'I:' . str_replace('/', '#', implode('I:', $this -> arIgnoreFilesRegex) );
  187.  
  188.             $cacheNameOpen=str_replace(array('*', '?'), array('\*', '\?'), $cacheName);
  189.  
  190.         #print '<pre>' . htmlspecialchars($cacheName) . '</pre>';
  191.  
  192.         if ( is_file($this -> dir . '/'.$cacheNameOpen) ) {
  193.            return json_decode(file_get_contents($this -> dir . '/' .$cacheNameOpen), 1);
  194.         }
  195.  
  196.         $dirs  = array();
  197.         $files = array();
  198.         $ar    = array();
  199.  
  200.         $sortItem    = $this -> sortItem;
  201.         $sortUpDown  = $this -> sortUpDown;
  202.  
  203.         if (! $this -> DH ) {
  204.             return false;
  205.         }
  206.         $dir = $this->dir . '/';
  207.  
  208.         while (false !== ($s = readdir($this -> DH))) {
  209.             $insert = false;
  210.             $c = $s[0];
  211.             $showHiddenFiles    = $this -> showHiddenFiles;
  212.             $showDirLinks       = $this -> showDirLinks;
  213.             $arIgnoreFilesRegex = $this -> arIgnoreFilesRegex;
  214.  
  215.             if ( $showHiddenFiles or '.' != $c ) { $insert = true; }
  216.             if ( (!$showDirLinks) and ($s == '.' or $s == '..') ) { $insert = false; }
  217.             if ($insert and $arIgnoreFilesRegex) {
  218.                 foreach ($arIgnoreFilesRegex as $pattern) {
  219.                     if ($insert and preg_match( $pattern, $s ) ) { $insert = false; }
  220.                 }
  221.             }
  222.  
  223.             if ($insert) {
  224.                 if ( is_dir( $dir . $s ) ) {
  225.                     $dirs[] = $s;
  226.                 } elseif ( is_file( $dir . $s ) ) {
  227.                     $files[] = $s;
  228.                 }
  229.             }
  230.         }
  231.  
  232.         $arNames = array();
  233.  
  234.         $showFoldersFirst = $this -> showFoldersFirst;
  235.         if ($showFoldersFirst) {
  236.             sort($dirs,  $this -> sortOrder);
  237.             if ('name' == $sortItem and 'down' == $sortUpDown) { $dirs = array_reverse($dirs); }
  238.             foreach($dirs as $s) { $arNames[] = $s; }
  239.             sort($files, $this -> sortOrder);
  240.             if ('name' == $sortItem and 'down' == $sortUpDown) { $files = array_reverse($files); }
  241.             foreach($files as $s) { $arNames[] = $s; }
  242.         } else {
  243.             foreach($dirs  as $s) { $arNames[] = $s; }
  244.             foreach($files as $s) { $arNames[] = $s; }
  245.             sort($arNames,  $this -> sortOrder);
  246.             if ('name' == $sortItem and 'down' == $sortUpDown) { $arNames = array_reverse($arNames); }
  247.         }
  248.         $ar = array();
  249.  
  250.  
  251.         if( ! function_exists('finfo_open') ) {
  252.             trigger_error(__FILE__ . 'class Dir2Array: file_info ist nicht installiert', E_USER_NOTICE);
  253.             setError (32, E_USER_NOTICE, 'Die PHP-Erweiterung file_info ist nicht installiert. Rückfall auf mime_content_type()');
  254.             $resFinfo = false;
  255.         } else {
  256.             $resFinfo = new finfo(FILEINFO_MIME);
  257.         }
  258.  
  259.         if (count($arNames)) {
  260.             foreach ($arNames as $s) {
  261.                 $f = $dir . $s;
  262.                 $ar[$s]['type'] = filetype($f);
  263.                 $ar[$s]['size'] = filesize($f);
  264.                 $ar[$s]['sizeHuman'] = humanReadableBin($ar[$s]['size'], 2, '&nbsp;' ,'B');
  265.                 $ar[$s]['filemtime'] = filemtime($f);
  266.                 $ar[$s]['filemtimeHuman'] = date($this -> filetimemHumanStyle, $ar[$s]['filemtime']);
  267.  
  268.                 if ($resFinfo) {
  269.                     $info = $resFinfo -> file($f);
  270.                     if ( strpos($info, ';') ) {
  271.                         $parts=explode(';', $info, 2);
  272.                         $ar[$s]['mime'] = $parts[0];
  273.                         $ar[$s]['charset']=str_replace( ' charset=', '', $parts[1] );
  274.                     } else {
  275.                         $ar[$s]['mime']=$info;
  276.                         $ar[$s]['charset'] = false;
  277.                     }
  278.                 } else {
  279.                     $ar[$s]['mime'] = mime_content_type($f);
  280.                     $ar[$s]['charset'] = false;
  281.  
  282.                 }
  283.             }
  284.         }
  285.  
  286.         if ('mime' == $sortItem) {
  287.             $ar = sort_2D_hash( $ar, 'mime', SORT_STRING );
  288.             if ('down' == $sortUpDown) {
  289.                 $ar = array_reverse($ar);
  290.             }
  291.         } elseif ('size' == $sortItem) {
  292.             $ar = sort_2D_hash( $ar, 'size', SORT_NUMERIC );
  293.             if ('down' == $sortUpDown) {
  294.                 $ar = array_reverse($ar);
  295.             }
  296.         } elseif ('time' == $sortItem) {
  297.             $ar = sort_2D_hash( $ar, 'filemtime', SORT_NUMERIC );
  298.             if ('down' == $sortUpDown) {
  299.                 $ar = array_reverse($ar);
  300.             }
  301.         }
  302.  
  303.  
  304.         ## Cache: ##
  305.        if (! is_dir( $dir . '/.projekte_dir_cache/' ) ) {
  306.             if (is_writable($dir) ) {
  307.                 mkdir($dir . '/.projekte_dir_cache/');
  308.             }
  309.         }
  310.         if (is_dir( $dir . '/.projekte_dir_cache/' ) ) {
  311.             file_put_contents( $dir . '/'.$cacheName, json_encode($ar, JSON_PRETTY_PRINT) );
  312.         }
  313.         return $ar;
  314.     }
  315. }