it-swarm-pt.tech

Excluir arquivos ocultos do scandir

Eu estou usando o seguinte código para obter uma lista de imagens em um diretório:

$files = scandir($imagepath);

mas $files também inclui arquivos ocultos. Como posso excluí-los?

32
Sino

No Unix, você pode usar preg_grep para filtrar nomes de arquivos que começam com um ponto:

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

Simplesmente use esta função

$files = nothidden($imagepath);
4
Henrik Albrechtsson

Eu costumo usar DirectoryIterator para coisas como esta que fornece um método simples para ignorar arquivos de ponto:

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

Eu acho que você está tentando filtrar os arquivos ocultos, faz mais sentido e parece melhor fazer isso ...

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

Eu também não chamo a variável $files pois isso implica que ela contém apenas arquivos, mas você poderia de fato obter diretórios também ... em alguns casos :)

1
TiMacDonald

usar preg_grep para excluir o nome dos arquivos com caracteres especiais por exemplo.

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

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

1
Vrushal Raut

$files = array_diff(scandir($imagepath), array('..', '.'));

ou

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

pode ser mais rápido que 

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

0
Agnel Vishal

Assumindo que os arquivos ocultos começam com um . você pode fazer algo assim ao produzir:

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

Agora você verifica todos os itens, se não houver . como o primeiro caractere, e, se não, echos que você gostaria de fazer.

0
stefandoorn

Use o código a seguir, se quiser redefinir o índice da matriz e definir a ordem:

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

Uma linha:

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

Eu encontrei um comentário do php.net, especificamente para sistemas Windows: http://php.net/manual/en/function.filetype.php#87161

Citando aqui para fins de arquivamento:

Eu uso a versão CLI do PHP no Windows Vista. Veja como determinar se um arquivo está marcado como "oculto" pelo NTFS:

function is_hidden_file($fn) {

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

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

    return false;
}

Mudar if($attr[3] === 'h') para if($attr[4] === 's') irá verificar os arquivos do sistema.

Isso deve funcionar em qualquer sistema operacional Windows que forneça comandos do shell do DOS.

0
Oytun