wake-up-neo.com

Gibt es eine Möglichkeit, glob () -Dateien nur zu löschen?

Ich weiß, dass glob nach allen Dateien oder nur nach allen Verzeichnissen in einem Ordner suchen kann:

echo "All files:\n";
$all = glob("/*");
var_dump($all);

echo "Only directories\n";
$dirs = glob("/*", GLOB_ONLYDIR);
var_dump($dirs);

Ich habe jedoch nichts gefunden, um nur Dateien in einer Zeile effizient zu finden.

$files = array_diff(glob("/*"), glob("/*", GLOB_ONLYDIR));

Funktioniert gut, liest jedoch das Verzeichnis zweimal (auch wenn es einige Optimierungen gibt, die das zweite Durchsuchen schneller machen).

28
Alain Tiemblo

Ich habe endlich eine Lösung gefunden:

echo "Only files\n";
$files = array_filter(glob("/*"), 'is_file');
var_dump($files);

Achten Sie jedoch darauf, dass array_filter die numerischen Schlüssel beibehält: Verwenden Sie array_values ​​ , wenn Sie das Array neu indizieren müssen.

49
Alain Tiemblo

Es gibt einen einfacheren Weg, nur eine Zeile:

$files = glob("/path/to/directory/*.{*}", GLOB_BRACE);

das {*} bedeutet alle Dateienden, also jede Datei, aber keinen Ordner!

5
mulcher

Sie können GLOB_BRACE verwenden, um Dokumente mit einer Liste bekannter Dateierweiterungen abzugleichen:

$files = glob("/path/to/directory/*.{jpg,gif,png,html,htm,php,ini}", GLOB_BRACE);

siehe: http://www.electrictoolbox.com/php-glob-find-files/

5
RafaSashi

Andere Lösung:

$files = glob('../{,.}*', GLOB_BRACE);
foreach ($files as $i => $file) {
    if (is_dir($file)) {
        unset($files[$i]);
    }
}

Oder:

$files = glob('../{,.}*', GLOB_BRACE | GLOB_MARK);
foreach ($files as $i => $file) {
    if ($file[ strlen($file) - 1 ] == '/') {
        unset($files[$i]);
    }
}

Beide behalten numerische Tasten bei, so dass Sie vielleicht neu indizieren möchten .

P.S. Sie müssen {,.}*', GLOB_BRACE verwenden, wenn Sie auch versteckte Dateien erhalten möchten .

1
mgutt