Ejemplo n.º 1
0
 /**
  * Returns a list of MFileInfo objects for all the files and directories in 
  * the directory, ordered according to the name and attribute filters 
  * previously set with setNameFilters() and setFilter(), and sorted 
  * according to the flags set with setSorting().<br />
  * <br />
  * The name filter, file attribute filter, and sorting specification can be 
  * overridden using the nameFilters, filters, and sort arguments.<br />
  * <br />
  * Returns an empty list if the directory is unreadable, does not exist, or 
  * if nothing matches the specification.
  * 
  * @param MStringList|null $nameFilters
  * @param Filter|int $filters
  * @param SortFlag|int $sort
  * @return \MToolkit\Core\MFileInfoList
  * @throws \Exception
  */
 public function getEntryInfoList(MStringList $nameFilters = null, $filters = Filter::NO_FILTER, $sort = SortFlag::NO_SORT)
 {
     if ($this->fileInfo->exists() === false || $this->fileInfo->isReadable() === false) {
         return new MFileInfoList();
     }
     $files = array();
     if ($handle = opendir($this->fileInfo->getAbsoluteFilePath())) {
         while (false !== ($entry = readdir($handle))) {
             $files[] = $entry;
         }
         closedir($handle);
     }
     //        var_dump($files);
     // Apply the name filters
     $nameFilteredFiles = array();
     if ($nameFilters === null) {
         $nameFilters = $this->nameFilters;
     }
     if ($nameFilters != null && $nameFilters->size() > 0) {
         foreach ($nameFilters as $nameFilter) {
             foreach ($files as $file) {
                 if (fnmatch($nameFilter, $this->fileInfo->getAbsoluteFilePath() . MDir::getSeparator() . $file)) {
                     $nameFilteredFiles[] = $file;
                 }
             }
         }
     } else {
         $nameFilteredFiles = $files;
     }
     // Apply the filters
     $filteredFiles = array();
     foreach ($nameFilteredFiles as $nameFilteredFile) {
         $fileInfo = new MFileInfo($this->fileInfo->getAbsoluteFilePath() . MDir::getSeparator() . $nameFilteredFile);
         $toAdd = true;
         // Filter::DIRS
         if ($fileInfo->isDir() === false && $filters & Filter::DIRS) {
             $toAdd = $toAdd && false;
         }
         // Filter::FILES
         if ($fileInfo->isFile() === false && $filters & Filter::FILES) {
             $toAdd = $toAdd && false;
         }
         // Filter::NO_SYM_LINKS
         if ($fileInfo->isSymLink() === false && $filters & Filter::NO_SYM_LINKS) {
             $toAdd = $toAdd && false;
         }
         // Filter::NO_DOT_AND_DOT_DOT
         if (($nameFilteredFile == "." || $nameFilteredFile == "..") && $filters & Filter::NO_DOT_AND_DOT_DOT) {
             $toAdd = $toAdd && false;
         }
         // Filter::NO_DOT
         if ($nameFilteredFile == "." && $filters & Filter::NO_DOT) {
             $toAdd = $toAdd && false;
         }
         // Filter::NO_DOT_DOT
         if ($nameFilteredFile == ".." && $filters & Filter::NO_DOT_DOT) {
             $toAdd = $toAdd && false;
         }
         // Filter::ALL_ENTRIES
         //            if ($filters & Filter::ALL_ENTRIES)
         //            {
         //                $toAdd = $toAdd || true;
         //            }
         // Filter::READABLE
         if ($fileInfo->isReadable() === false && $filters & Filter::READABLE) {
             $toAdd = $toAdd && false;
         }
         // Filter::WRITABLE
         if ($fileInfo->isWritable() === false && $filters & Filter::WRITABLE) {
             $toAdd = $toAdd && false;
         }
         // Filter::EXECUTABLE
         if ($fileInfo->isExecutable() === false && $filters & Filter::EXECUTABLE) {
             $toAdd = $toAdd && false;
         }
         // Unsupported filter
         if ($filters & Filter::MODIFIED || $filters & Filter::HIDDEN || $filters & Filter::SYSTEM || $filters & Filter::DRIVES) {
             throw new \Exception("Filter " . $filters . " not yet supported.");
         }
         if ($toAdd === true) {
             $filteredFiles[] = $nameFilteredFile;
         }
     }
     if ($filters & Filter::ALL_DIRS) {
         $dirs = array_filter(glob($this->getAbsolutePath() . MDir::getSeparator() . '*'), 'is_dir');
         $filteredFiles = array_merge($filteredFiles, $dirs);
         $filteredFiles = array_unique($filteredFiles);
     }
     $filesInfos = array();
     foreach ($filteredFiles as $filteredFile) {
         $filesInfos[] = new MFileInfo($this->getAbsolutePath() . MDir::getSeparator() . $filteredFile);
     }
     // Sort
     if ($sort != SortFlag::NO_SORT) {
         if ($sort & SortFlag::NAME) {
             usort($filesInfos, array($this, "sortByName"));
         }
         if ($sort & SortFlag::TIME) {
             usort($filesInfos, array($this, "sortByTime"));
         }
         if ($sort & SortFlag::SIZE) {
             usort($filesInfos, array($this, "sortBySize"));
         }
         if ($sort & SortFlag::TYPE) {
             usort($filesInfos, array($this, "sortByType"));
         }
         if ($sort & SortFlag::DIRS_FIRST) {
             usort($filesInfos, array($this, "sortByDirsFirst"));
         }
         if ($sort & SortFlag::DIRS_LAST) {
             usort($filesInfos, array($this, "sortByDirsLast"));
         }
         if ($sort & SortFlag::REVERSED) {
             usort($filesInfos, array($this, "sortReversed"));
         }
         if ($sort & SortFlag::IGNORE_CASE) {
             usort($filesInfos, array($this, "sortIgnoreCase"));
         }
     }
     $toReturn = new MFileInfoList();
     $toReturn->appendArray($filesInfos);
     return $toReturn;
 }