web-dev-qa-db-de.com

Verborgene Dateien von Scandir ausschließen

Ich verwende den folgenden Code, um eine Liste von Bildern in einem Verzeichnis zu erhalten:

$files = scandir($imagepath);

$files enthält jedoch auch versteckte Dateien. Wie kann ich sie ausschließen?

32
Sino

Unter Unix können Sie preg_grep verwenden, um Dateinamen herauszufiltern, die mit einem Punkt beginnen:

$files = preg_grep('/^([^.])/', scandir($imagepath));
61
mario
function nothidden($path) {
    $files = scandir($path);
    foreach($files as $file) {
        if ($file[0] != '.') $nothidden[] = $file;
        return $nothidden;
    }
}

Nutzen Sie einfach diese Funktion

$files = nothidden($imagepath);
4

Ich neige dazu, DirectoryIterator für Dinge wie diese zu verwenden, die eine einfache Methode zum Ignorieren von Punktdateien bieten:

$path = '/your/path';
foreach (new DirectoryIterator($path) as $fileInfo) {
    if($fileInfo->isDot()) continue;
    $file =  $path.$fileInfo->getFilename();
}
4
robjmills
$files = array_diff(scandir($imagepath), array('..', '.'));

oder

$files = array_slice(scandir($imagepath), 2);

könnte schneller sein als

$files = preg_grep('/^([^.])/', scandir($imagepath));
1
Agnel Vishal

Ich denke, weil Sie versuchen, die versteckten Dateien herauszufiltern, ist es sinnvoller und sieht am besten aus, um dies zu tun ...

$items = array_filter(scandir($directory), function ($item) {
    return 0 !== strpos($item, '.');
});

Ich würde auch die Variable $files nicht nennen, da sie impliziert, dass sie nur Dateien enthält, aber man könnte tatsächlich auch Verzeichnisse bekommen ... in einigen Fällen :)

1
TiMacDonald

verwenden Sie preg_grep, um den Dateinamen mit Sonderzeichen für z.

$dir = "images/";
$files = preg_grep('/^([^.])/', scandir($dir));

http://php.net/manual/de/function.preg-grep.php

1
Vrushal Raut

Angenommen, die versteckten Dateien beginnen mit einem ., können Sie bei der Ausgabe Folgendes tun:

foreach($files as $file) {
    if(strpos($file, '.') !== (int) 0) {
        echo $file;
    }
}

Jetzt prüfen Sie für jedes Element, ob es kein . als erstes Zeichen gibt und wenn nicht, wie es Ihnen gefällt.

0
stefandoorn

Verwenden Sie den folgenden Code, wenn Sie auch den Array-Index zurücksetzen und die Reihenfolge festlegen möchten:

$path = "the/path";
$files = array_values(
    preg_grep(
        '/^([^.])/', 
        scandir($path, SCANDIR_SORT_ASCENDING)
));

Eine Linie:

$path = "daten/kundenimporte/";
$files = array_values(preg_grep('/^([^.])/', scandir($path, SCANDIR_SORT_ASCENDING)));
0
Black

Ich bin auf einen Kommentar von php.net gestoßen, speziell für Windows-Systeme: http://php.net/manual/de/function.filetype.php#87161

Hier zu Archivzwecken zitieren:

Ich verwende die CLI-Version von PHP unter Windows Vista. So stellen Sie fest, ob eine Datei von NTFS als "versteckt" markiert ist:

function is_hidden_file($fn) {

    $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA'));

    if($attr[3] === 'h')
        return true;

    return false;
}

Wenn Sie if($attr[3] === 'h') in if($attr[4] === 's') ändern, wird nach Systemdateien gesucht.

Dies sollte auf jedem Windows-Betriebssystem funktionieren, das DOS-Shell-Befehle bereitstellt.

0
Oytun