/** * 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; }