Obtendo os nomes de todos os arquivos em um diretório com PHP


87

Por algum motivo, continuo recebendo um '1' para os nomes de arquivo com este código:

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

Quando eu repito cada elemento em $ results_array, obtenho um monte de '1's, não o nome do arquivo. Como obtenho o nome dos arquivos?


1
Existem algumas opções usando glob .
mercearia noturna de


1
O problema do autor da postagem era que a atribuição tem uma prioridade muito baixa, então o operador '! ==' é avaliado primeiro e o resultado binário dessa operação é atribuído a $ file. A única correção necessária é usar ($ file = readdir ($ handle))! == FALSE "
Omn


de 69 votos para 70. Eu me sinto o oposto de Hank Moody
Charlie

Respostas:


167

Não se preocupe em abrir / ler e usar em globvez disso:

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}

24
Você pode querer envolver array_filter(..., 'is_file')esse glob, já que a pergunta pede por arquivos.
salathe

23
Nem todos os nomes de arquivo têm a forma *.*: apenas use *.
jameshfisher

Como podemos obter todos os arquivos na lista de extensões? Por exemplo, se quisermos todos os arquivos .php e .js?
Nis

3
Sim, essa resposta não é muito robusta. Os arquivos não precisam ter extensões e diretórios podem ser nomeados something.something. É melhor usar array_filtere glob($log_directory.'/*').
Andrew

Eu votei positivamente porque só precisava de uma resposta simples e todos os arquivos relevantes para o meu caso de uso seriam *.*. Uma expressão mais robusta tornaria esta resposta ainda melhor.
TecBrat


18

Você precisa colocar $file = readdir($handle)parênteses.

Aqui está:

$log_directory = 'your_dir_name_here';

$results_array = array();

if (is_dir($log_directory))
{
        if ($handle = opendir($log_directory))
        {
                //Notice the parentheses I added:
                while(($file = readdir($handle)) !== FALSE)
                {
                        $results_array[] = $file;
                }
                closedir($handle);
        }
}

//Output findings
foreach($results_array as $value)
{
    echo $value . '<br />';
}


14

Como a resposta aceita tem duas deficiências importantes, estou postando a resposta aprimorada para os recém-chegados que estão procurando uma resposta correta:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Filtrar os globeresultados da função com is_fileé necessário, porque pode retornar alguns diretórios também.
  2. Nem todos os arquivos têm um .em seus nomes, portanto, o */*padrão é uma droga em geral.

Esta é uma execução limpa que funcionou para mim. As respostas anteriores mostraram diretórios em resultados que eu não queria.
AWP de

O senhor precisa de mais votos positivos! Na verdade (no Windows) eu tive que usar basename($file)para obter apenas o nome do arquivo em vez de todo o caminho com o nome do arquivo.
Pauloco

10

Eu tenho um código menor para fazer isso:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}

Me devolvendo todos os arquivos, exceto dois arquivos de lixo chamados "." e "..". Não tenho nenhum arquivo chamado "." e ".." no meu diretório.
Kamranbhatti585

1
Use $ files = array_diff (scandir ($ path), array ('.', '..')); para liberar os erros acima discutidos.
Kamranbhatti585

Agradável. como faço para remover as extensões dos arquivos? (Preciso remover .phpem cada arquivo.)
KSPR

8

Em alguns sistemas operacionais, você obtém . ..e .DS_Store, Bem, não podemos usá-los, então vamos ocultá-los.

Primeiro comece a obter todas as informações sobre os arquivos, usando scandir()

// Folder where you want to get all files names from
$dir = "uploads/";

/* Hide this */
$hideName = array('.','..','.DS_Store');    

// Sort in ascending order - this is default
$files = scandir($dir);
/* While this to there no more files are */
foreach($files as $filename) {
    if(!in_array($filename, $hideName)){
       /* echo the name of the files */
       echo "$filename<br>";
    }
}

4

É devido à precidência do operador. Tente mudar para:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);

2

glob()e FilesystemIteratorexemplos:

/* 
 * glob() examples
 */

// get the array of full paths
$result = glob( 'path/*' );

// get the array of file names
$result = array_map( function( $item ) {
    return basename( $item );
}, glob( 'path/*' ) );


/* 
 * FilesystemIterator examples
 */

// get the array of file names by using FilesystemIterator and array_map()
$result = array_map( function( $item ) {
    // $item: SplFileInfo object
    return $item->getFilename();
}, iterator_to_array( new FilesystemIterator( 'path' ), false ) );

// get the array of file names by using FilesystemIterator and iterator_apply() filter
$it = new FilesystemIterator( 'path' );
iterator_apply( 
    $it, 
    function( $item, &$result ) {
        // $item: FilesystemIterator object that points to current element
        $result[] = (string) $item;
        // The function must return TRUE in order to continue iterating
        return true;
    }, 
    array( $it, &$result )
);

1

Você pode apenas experimentar a scandir(Path)função. é rápido e fácil de implementar

Sintaxe:

$files = scandir("somePath");

Esta função retorna uma lista de arquivos em um Array.

para ver o resultado, você pode tentar

var_dump($files);

Ou

foreach($files as $file)
{ 
echo $file."< br>";
} 



0

Acabei de usar este código:

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>


0

Código recursivo para explorar todo o arquivo contido em um diretório ('$ path' contém o caminho do diretório):

function explore_directory($path)
{
    $scans = scandir($path);

    foreach($scans as $scan)
    {
        $new_path = $path.$scan;

        if(is_dir($new_path))
        {
            $new_path = $new_path."/";
            explore_directory($new_path);
        }
        else // A file
        {
            /*
                  Body of code
            */
        }
    }
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.