2012-12-29 9 views
24

Ich weiß, dass glob für alle Dateien sehen kann oder nur alle Verzeichnisse in einem Ordner:Gibt es eine Möglichkeit, um nur Dateien zu glob()?

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

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

Aber ich habe etwas zu finden, nur Dateien in einer einzigen Zeile effizient nicht gefunden.

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

funktioniert gut, aber liest Verzeichnis zweimal (auch wenn es some optimizations ist, die das zweite Surfen schneller machen).

+1

Sie können 'glob (" *. * ")' Dies funktioniert jedoch nicht, wenn ein Ordner ein '.' darin enthält oder eine Datei keine Erweiterung hat. –

Antwort

44

ich endlich eine Lösung gefunden:

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

Aber kümmern, werden array_filter Zifferntasten erhalten: Verwenden Sie array_values wenn Sie das Array neu indizieren müssen.

+0

Schön! Die Verwendung der foreach-Schleife löst das Problem der erhaltenen numerischen Schlüssel von array_filter. – Imdad

-10
$all = glob("/*.*"); 

Dies wird alles mit einem "." nach dem Dateinamen. also im Grunde alle Dateien.

+14

Seit wann müssen Dateien eine Erweiterung haben? Und was lässt Sie glauben, dass ein Verzeichnis keinen Punkt in seinem Namen haben kann? –

5

Sie können GLOB_BRACE verwenden, um Dokumente mit einer Liste der bekannten Dateierweiterungen anzupassen:

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

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

+6

Funktioniert in den meisten Fällen, aber passen Sie auf, da Verzeichnisse auch 'toto.jpg' genannt werden können, wenn Sie möchten. –

3

Es ist ein einfacher Weg, nur eine Zeile:

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

Die {*} bedeutet alle Dateiendungen, also jede Datei, aber keinen Ordner!

+2

Nein, '{}' ersetzt alle Zeichen in Dateien oder Ordnern ohne Unterschied. –

1

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 Zifferntasten erhalten, so dass Sie vielleicht zu re-index wollen.

P.S. Sie müssen {,.}*', GLOB_BRACE verwenden, wenn Sie auch get hidden files möchten.

Verwandte Themen