Finder: vyhledávání souborů

Potřebujete projít adresáře na disku? Hledáte v nich soubory? Třída Nette\Utils\Finder vám to maximálně usnadní.

Instalace:

composer require nette/finder

Všechny příklady předpokládají vytvořený alias:

use Nette\Utils\Finder;

Hledání souborů

Jak vyhledat soubory *.txt v adresáři $dir a všech jeho podadresářích?

foreach (Finder::findFiles('*.txt')->from($dir) as $key => $file) {
	// $key je řetězec s názvem souboru včetně cesty
	// $file je objekt SplFileInfo
}

Soubory v proměnné $file jsou instance třídy SplFileInfo.

Pokud by adresář neexistoval, vyhodí se výjimka Nette\UnexpectedValueException.

A co třeba hledání souborů v adresáři bez procházení podadresářů? Místo from() použijeme in():

Finder::findFiles('*.txt')->in($dir)

Hledání podle více masek a dokonce z více adresářů najednou:

Finder::findFiles('*.txt', '*.php')
	->in($dir1, $dir2) // nebo from($dir1, $dir2)

přičemž parametry lze zadat i ve formě polí:

Finder::findFiles(['*.txt', '*.php'])
	->in([$dir1, $dir2]) // nebo from([$dir1, $dir2])

Omezit hloubku procházení lze metodou limitDepth().

Hledání adresářů

Kromě souborů lze hledat také adresáře pomocí Finder::findDirectories('subdir*').

Nebo soubory i adresáře dohromady pomocí Finder::find('*.txt'), maska se v tomto případě vztahuje jen na soubory. Při hledání do hloubky pomocí from() se vrací nejprve podadresář a teprve poté soubory v něm obsažené, což lze obrátit pomocí childFirst().

Maska

Maska nemusí popisovat jen název souboru, ale také cestu. Příklad: hledání souborů *.jpg umístěných v podadresáři začínajícím na imag:

Finder::findFiles('imag*/*.jpg')

Známé zástupné symboly * a ? tedy představují libovolné znaky s výjimkou oddělovače adresářů /. Dvojitý ** představuje libovolné znaky včetně oddělovače adresářů:

Finder::findFiles('imag**/*.jpg')
// najde i image/subdir/file.jpg

V masce můžete používat i rozsahy [...] nebo negativní rozsahy [!...] známé z regulárních výrazů. Hledání souborů *.txt obsahujících číslici v názvu:

Finder::findFiles('*[0-9]*.txt')

Vyloučení

Pomocí exclude() můžete předat masky, kterým naopak soubor nesmí vyhovovat. Hledání souborů *.txt kromě těch, co obsahují v názvu písmeno X

Finder::findFiles('*.txt')
	->exclude('*X*')

Pokud exclude() uvedeme až za from(), vztahuje se na procházené podadresáře:

Finder::findFiles('*.php')
	->from($dir)
	->exclude('temp', '.git')

Filtrování

Dále je možné výsledky filtrovat, například podle velikosti souboru. Takto najdeme soubory s velikostí v rozmezí 100 až 200 bytů:

Finder::findFiles('*.php')
	->size('>=', 100)
	->size('<=', 200)
	->from($dir)

Filtrování podle data poslední změny. Příklad: hledání souborů změněných v posledních dvou týdnech:

Finder::findFiles('*.php')
	->date('>', '- 2 weeks')
	->from($dir)

Obě funkce rozumí operátorům >, >=, <, <=, =, !=.

Zde se prochází soubory PHP s počtem řádků větším než 1000. Jako filtr použijeme vlastní callback:

$hasMoreThan100Lines = function (SplFileInfo $file): bool {
	return count(file($file->getPathname())) > 1000;
};

Finder::findFiles('*.php')
	->filter($hasMoreThan100Lines)

Šikovné, že? Finder určitě najde využití ve vašich aplikacích.

verze: 4.0 3.x 2.x