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?


1
Istnieje kilka opcji korzystania z globu .
całonocny sklep spożywczy


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) {
    ...
}

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


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 />';
}


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.

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/>";
}

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

4

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

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

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

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



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>";
?>


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
            */
        }
    }
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.