Sto usando il seguente codice per ottenere un elenco di immagini in una directory:escludere i file nascosti da scandir
$files = scandir($imagepath);
ma $files
include anche i file nascosti. Come posso escluderli?
Sto usando il seguente codice per ottenere un elenco di immagini in una directory:escludere i file nascosti da scandir
$files = scandir($imagepath);
ma $files
include anche i file nascosti. Come posso escluderli?
Supponendo che i file nascosti Iniziamo con una .
si può fare qualcosa di simile, quando l'output:
foreach($files as $file) {
if(strpos($file, '.') !== (int) 0) {
echo $file;
}
}
Ora di controllare per ogni elemento se non v'è alcuna .
come primo carattere, e se non ti ECHOS come faresti tu.
Usando 'strpos' per verificare se il primo carattere di un nome di file è un punto è inutilmente complicato - e inefficiente, poiché cerca tutto stringa quando ti interessa solo un personaggio. Inoltre, non ha assolutamente senso gettare il letterale '0' su un' int'; è già uno. Basta fare 'if ($ file [0]! = '.') {...}' invece. –
Io tendo ad usare DirectoryIterator per cose come questa che fornisce un metodo semplice per ignorare file punto:
$path = '/your/path';
foreach (new DirectoryIterator($path) as $fileInfo) {
if($fileInfo->isDot()) continue;
$file = $path.$fileInfo->getFilename();
}
Giusto per chiarire, 'isDot()' non ignora i file che iniziano con '.'. Ho appena provato sul mio sistema PHP 5.3.5. – resting
Questa risposta è sbagliata. "File Dot" o "File nascosti" su Unix sono * qualsiasi * file il cui nome inizia con un punto. Ma, per [la documentazione] (http://php.net/manual/en/directoryiterator.isdot.php), 'isDot' corrisponde solo se il file è' .' o '..'. Un rapido test conferma che non corrisponderà alla maggior parte dei file di punti. –
Sto ancora lasciando il segno di spunta per la soluzione di visto e avrei pubblicato un commento di seguito per una leggera correzione alla sua soluzione. (. .. e)
sue maschere soluzione le directory, ma non mascherare i file nascosti come .htaccess
un tweak minore risolve il problema:
foreach(new DirectoryIterator($curDir) as $fileInfo) {
//Check for something like .htaccess in addition to . and ..
$fileName = $fileInfo->getFileName();
if(strlen(strstr($fileName, '.', true)) < 1) continue;
echo "<h3>" . $fileName . "</h3>";
}
Questo è un modo follemente complicato per verificare se '$ fileName' inizia con un punto; Ho dovuto studiare la pagina man ['strstr'] (http://php.net/strstr) per dare un senso a quello che stai facendo qui. È anche * rotto *; questo filtra non solo i nomi di file che iniziano con un punto, ma anche i nomi di file senza punti in essi (poiché in questo caso 'strstr' restituisce' FALSE' e 'strlen (FALSE)' restituisce 0, che è minore di 1 Non c'è assolutamente bisogno di questa complessità, basta 'if ($ fileName [0] == '.') Continua 'invece. –
function nothidden($path) {
$files = scandir($path);
foreach($files as $file) {
if ($file[0] != '.') $nothidden[] = $file;
return $nothidden;
}
}
usare Basta questa funzione
$files = nothidden($imagepath);
Se non si desidera utilizzare' preg_grep' perché le espressioni regolari ti spaventano, * questo * è la strada da percorrere - controlla se il nome del file inizia con un punto * ottenendo il primo carattere e controllando se si tratta di un punto *. Non è scienza missilistica, ma non è necessario. Gli incantesimi "più intelligenti" che coinvolgono le funzioni stringa utilizzate da alcune altre risposte qui, oltre a essere inefficiente o sbagliato, sono inutilmente più complicate di questo approccio. –
Ho riscontrato un commento da php.net, in particolare per i sistemi Windows: http://php.net/manual/en/function.filetype.php#87161
Citando qui a scopo di archiviazione:
Io uso la versione CLI di PHP su Windows Vista. Ecco come determinare se un file è contrassegnato "nascosto" di NTFS:
function is_hidden_file($fn) { $attr = trim(exec('FOR %A IN ("'.$fn.'") DO @ECHO %~aA')); if($attr[3] === 'h') return true; return false; }
Modifica
if($attr[3] === 'h')
aif($attr[4] === 's')
sarà verificare la presenza di file di sistema.Questo dovrebbe funzionare su qualsiasi sistema operativo Windows che fornisce comandi shell DOS.
Mi sa perché si sta tentando di 'filtro' i file nascosti, ha più senso e sembra migliore per farlo ...
$items = array_filter(scandir($directory), function ($item) {
return 0 !== strpos($item, '.');
});
Mi piacerebbe anche non chiamo la variabile $files
in quanto implica che contiene solo file, ma in effetti potresti anche ottenere le directory ... in alcuni casi :)
utilizzare preg_grep per escludere il nome di file con caratteri speciali per es.
$dir = "images/";
$files = preg_grep('/^([^.])/', scandir($dir));
Le risposte qui sono circa hosting Linux. Per tutte le persone che desiderano leggere sull'hosting di Windows, consultare qui: [http://stackoverflow.com/questions/30290663/does-php-scandir-exclude-hidden-files-under-windows](http://stackoverflow. it/questions/30290663/does-php-scandir-exclude-hidden-files-under-windows) –