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?
Unter Unix können Sie preg_grep
verwenden, um Dateinamen herauszufiltern, die mit einem Punkt beginnen:
$files = preg_grep('/^([^.])/', scandir($imagepath));
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);
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();
}
$files = array_diff(scandir($imagepath), array('..', '.'));
oder
$files = array_slice(scandir($imagepath), 2);
könnte schneller sein als
$files = preg_grep('/^([^.])/', scandir($imagepath));
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 :)
verwenden Sie preg_grep, um den Dateinamen mit Sonderzeichen für z.
$dir = "images/";
$files = preg_grep('/^([^.])/', scandir($dir));
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.
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)));
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')
inif($attr[4] === 's')
ändern, wird nach Systemdateien gesucht.Dies sollte auf jedem Windows-Betriebssystem funktionieren, das DOS-Shell-Befehle bereitstellt.