Pobieranie nazw wszystkich plików w katalogu z PHP

87

Z jakiegoś powodu wciąż otrzymuję „1” dla nazw plików z tym kodem:

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

Kiedy powtarzam każdy element w tablicy wyników $ results_array, otrzymuję kilka jedynek, a nie nazwę pliku. Jak uzyskać nazwy plików?

DexterW
źródło
1
Istnieje kilka opcji korzystania z globu .
całonocny sklep spożywczy
możliwy duplikat Pobierz hierarchię katalogu z PHP
e-sushi
1
Problem z plakatem polegał na tym, że przypisanie miało bardzo niski priorytet, więc operator '! ==' jest najpierw oceniany, a binarny wynik tej operacji jest następnie przypisywany do $ file. Jedyną potrzebną poprawką jest użycie ($ file = readdir ($ handle))! == FALSE "
Omn,
z 69 głosów do 70. Czuję się jak przeciwieństwo Hanka Moody'ego
Charlie

Odpowiedzi:

167

Nie zawracaj sobie głowy open / readdir i użyj globzamiast tego:

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}
Tatu Ulmanen
źródło
24
Możesz owinąć array_filter(..., 'is_file')wokół tego globu, ponieważ pytanie dotyczy plików.
salathe
23
Nie wszystkie nazwy plików mają postać *.*: po prostu użyj *zamiast tego.
jameshfisher
Jak możemy uzyskać wszystkie pliki z listy rozszerzeń? Np. Jeśli chcemy mieć wszystkie pliki .php i .js?
Nis
3
Tak, ta odpowiedź nie jest zbyt solidna. Pliki nie muszą mieć rozszerzeń, a katalogi można nazywać something.something. Lepiej jest użyć array_filteri glob($log_directory.'/*').
Andrew,
Głosowałem za tym, ponieważ potrzebowałem tylko prostej odpowiedzi i wszystkie odpowiednie pliki dla mojego przypadku użycia byłyby *.*. Bardziej zdecydowane wyrażenie uczyniłoby to jeszcze lepszą odpowiedzią.
TecBrat
49

Styl SPL :

foreach (new DirectoryIterator(__DIR__) as $file) {
  if ($file->isFile()) {
      print $file->getFilename() . "\n";
  }
}

Sprawdź klasy DirectoryIterator i SplFileInfo , aby uzyskać listę dostępnych metod, których możesz użyć.

Ilija
źródło
Świetny sposób, aby uzyskać tylko pliki i tylko ich nazwy zamiast całej ścieżki, dzięki!
Chris
1
Tak. Aby uzyskać pełne ścieżki, możesz użyć getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ilija
18

Musisz otoczyć $file = readdir($handle)się nawiasami.

Proszę bardzo:

$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 />';
}
Mike Moore
źródło
14

Po prostu użyj glob('*'). Oto dokumentacja

Fletcher Moore
źródło
14

Ponieważ zaakceptowana odpowiedź ma dwa istotne wady, zamieszczam poprawioną odpowiedź dla tych nowych użytkowników, którzy szukają poprawnej odpowiedzi:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Filtrowanie globewyników funkcji za pomocą is_filejest konieczne, ponieważ może również zwrócić niektóre katalogi.
  2. Nie wszystkie pliki mają .w nazwie, więc */*generalnie wzorzec jest do niczego.
Aliweb
źródło
To czyste wykonanie, które zadziałało dla mnie. Poprzednie odpowiedzi pokazywały katalogi w wynikach, których nie chciałem.
AWP
Pan potrzebuje więcej głosów za! Właściwie (w basename($file)systemie Windows) musiałem użyć tylko nazwy pliku zamiast całej ścieżki z nazwą pliku.
Pauloco
10

Mam mniejszy kod do zrobienia tego:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}
YooRich.com
źródło
Zwraca mi wszystkie pliki oprócz dwóch plików śmieci o nazwie „”. i "..". Nie mam żadnego pliku o nazwie „”. i „..” w moim katalogu.
kamranbhatti585
1
Użyj $ files = array_diff (scandir ($ path), array ('.', '..')); aby uwolnić powyższe błędy, które omówiłem.
kamranbhatti585
Ładny. jak usunąć rozszerzenia plików? (Muszę usunąć .phpw każdym pliku.)
KSPR
8

W niektórych OS dostać . ..i .DS_Store, cóż nie możemy z nich korzystać tak niech nam je ukryć.

Najpierw uzyskaj wszystkie informacje o plikach, używając 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>";
    }
}
TheCrazyProfessor
źródło
4

Dzieje się tak dzięki precyzji operatora. Spróbuj zmienić to na:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);
ircmaxell
źródło
2

glob()i FilesystemIteratorprzykłady:

/* 
 * 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 )
);
Danijel
źródło
1

Możesz po prostu wypróbować tę scandir(Path)funkcję. jest szybki i łatwy do wdrożenia

Składnia:

$files = scandir("somePath");

Ta funkcja zwraca listę plików do tablicy.

aby zobaczyć wynik, możesz spróbować

var_dump($files);

Lub

foreach($files as $file)
{ 
echo $file."< br>";
} 
Ad Kahn
źródło
0

Po prostu używam tego kodu:

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>
merrais
źródło
0

Rekursywny kod do eksploracji całego pliku zawartego w katalogu („$ path” zawiera ścieżkę do katalogu):

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
            */
        }
    }
}
Prashant Goel
źródło