2011-12-16 19 views
28

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?

+0

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) –

risposta

50

Su Unix, è possibile utilizzare preg_grep per filtrare i nomi di file che iniziano con un punto:

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

Funziona anche in ambiente Windows – Remo

0

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.

+2

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. –

5

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(); 
} 
+14

Giusto per chiarire, 'isDot()' non ignora i file che iniziano con '.'. Ho appena provato sul mio sistema PHP 5.3.5. – resting

+2

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. –

-1

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>"; 
} 
+2

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. –

3
function nothidden($path) { 
    $files = scandir($path); 
    foreach($files as $file) { 
     if ($file[0] != '.') $nothidden[] = $file; 
     return $nothidden; 
    } 
} 

usare Basta questa funzione

$files = nothidden($imagepath); 
+0

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. –

0

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') a if($attr[4] === 's') sarà verificare la presenza di file di sistema.

Questo dovrebbe funzionare su qualsiasi sistema operativo Windows che fornisce comandi shell DOS.

1

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 :)

Problemi correlati