PHP ile bir dizindeki tüm dosyaların adlarını almak


88

Bazı nedenlerden dolayı, bu koda sahip dosya adları için '1' almaya devam ediyorum:

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

$ Results_array içindeki her bir elemanı yankıladığımda, dosyanın adı değil, bir sürü '1' alıyorum. Dosyaların adını nasıl alırım?


1
Glob kullanarak birkaç seçenek var .
allnightgrocery


1
Posterin karşılaştığı sorun, atamanın çok düşük önceliğe sahip olmasıydı, bu nedenle önce '! ==' operatörü değerlendirilir ve bu işlemin ikili sonucu daha sonra $ file'a atanır. Gereken tek düzeltme ($ dosya = readdir ($ tutamaç))! == FALSE "
Omn


69 oydan 70'e kadar. Hank Moody'nin tam tersi gibi hissediyorum
Charlie

Yanıtlar:


169

Open / readdir ile uğraşmayın ve globonun yerine şunu kullanın:

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

24
array_filter(..., 'is_file')Soru dosyalar için sorduğundan, bu kürenin etrafını sarmak isteyebilirsiniz .
Salathe

23
Tüm dosya adlarının biçimi yoktur *.*: *bunun yerine kullanın.
jameshfisher

Uzantılar listesindeki tüm dosyaları nasıl alabiliriz? Örneğin, tüm .php ve .js dosyalarını istiyorsak?
Nis

3
Evet, bu cevap çok sağlam değil. Dosyaların uzantılara sahip olması gerekmez ve dizinler adlandırılabilir something.something. Kullanımı daha iyidir array_filterve glob($log_directory.'/*').
Andrew

Sadece basit cevaba ihtiyacım olduğu ve kullanım durumum için ilgili tüm dosyalar olduğu için bunu destekledim *.*. Daha sağlam bir ifade, bunu daha da iyi bir cevap haline getirir.
TecBrat

50

SPL stili:

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

Kullanabileceğiniz kullanılabilir yöntemlerin listesi için DirectoryIterator ve SplFileInfo sınıflarını kontrol edin .


Tüm yol yerine yalnızca dosyaları ve yalnızca adlarını almanın harika bir yolu, teşekkürler!
Chris

1
Evet. Tam yollar için şunları kullanabilirsiniz getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ilija

18

$file = readdir($handle)Parantez içine almanız gerekir .

Hadi bakalım:

$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

Kabul edilen cevabın iki önemli eksikliği olduğundan, doğru cevabı arayan yeni gelenler için geliştirilmiş cevabı gönderiyorum:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. globeİşlev sonuçlarını ile filtrelemek is_filegereklidir, çünkü bazı dizinleri de döndürebilir.
  2. Tüm dosyaların .adlarında bir */*işareti yoktur , bu nedenle kalıp genel olarak berbattır.

Bu benim için işe yarayan temiz bir infaz. Önceki cevaplar, istemediğim sonuçlarda dizinleri gösterdi.
AWP

Daha fazla oy almanız gerekiyor efendim! Aslında (Windows'ta) basename($file)dosya adı olan tüm yol yerine sadece dosya adını almak için kullanmak zorunda kaldım.
Pauloco

11

Bunu yapmak için daha küçük bir kodum var:

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

"." Adlı iki çöp dosyası dışındaki tüm dosyaları bana döndürüyor. ve "..". "" Adında bir dosyam yok. ve dizinimde "..".
kamranbhatti585

1
$ Dosyalar = array_diff (scandir ($ yol), dizi ('.', '..')); tartıştığım yukarıdaki hataları gidermek için.
kamranbhatti585

Güzel. dosyaların uzantılarını nasıl kaldırırım? ( .phpHer dosyadan kaldırmam gerekiyor .)
KSPR

8

Bazı işletim sistemlerinde alırsınız . ..ve.DS_Store onları kullanamayız, bu yüzden onları gizleyelim.

Öncelikle, dosyalar hakkında tüm bilgileri alın. 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

Operatör güvencesinden kaynaklanıyor. Şu şekilde değiştirmeyi deneyin:

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

2

glob()ve FilesystemIteratorörnekler:

/* 
 * 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

Sadece scandir(Path)işlevi deneyebilirsin . uygulaması hızlı ve kolaydır

Sözdizimi:

$files = scandir("somePath");

Bu İşlev, bir dizi dosya dizisine döndürür.

sonucu görmek için deneyebilirsiniz

var_dump($files);

Veya

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



0

Ben sadece bu kodu kullanıyorum:

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

Bir dizinde bulunan tüm dosyayı keşfetmek için özyinelemeli kod ('$ yol' dizinin yolunu içerir):

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
            */
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.