Mendapatkan nama semua file dalam direktori dengan PHP

88

Untuk beberapa alasan, saya terus mendapatkan '1' untuk nama file dengan kode ini:

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

Ketika saya menggemakan setiap elemen dalam $ results_array, saya mendapatkan banyak '1's, bukan nama file. Bagaimana cara mendapatkan nama file?

DexterW
sumber
1
Ada beberapa opsi menggunakan glob .
allnightgrocery
kemungkinan duplikat Dapatkan hierarki direktori dengan PHP
e-sushi
1
Masalah yang dimiliki poster adalah bahwa penugasan memiliki prioritas yang sangat rendah, sehingga operator '! ==' dievaluasi terlebih dahulu dan hasil biner dari operasi tersebut kemudian ditetapkan ke $ file. Satu-satunya perbaikan yang diperlukan adalah menggunakan ($ file = readdir ($ handle))! == FALSE "
Omn
dari 69 suara menjadi 70. Saya merasa kebalikan dari Hank Moody
Charlie

Jawaban:

169

Jangan repot-repot dengan open / readdir dan gunakan globsebagai gantinya:

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}
Tatu Ulmanen
sumber
24
Anda mungkin ingin membungkus array_filter(..., 'is_file')glob itu karena pertanyaan menanyakan file.
salathe
23
Tidak semua nama file memiliki bentuk *.*: gunakan *saja.
jameshfisher
Bagaimana kita bisa mendapatkan semua file dalam daftar ekstensi? Misalnya jika kita ingin semua file .php dan .js?
Nis
3
Ya, jawaban ini tidak terlalu kuat. File tidak perlu memiliki ekstensi dan direktori dapat diberi nama something.something. Lebih baik menggunakan array_filterdan glob($log_directory.'/*').
Andrew
Saya menaikkan suara ini karena saya hanya perlu jawaban sederhana dan semua file yang relevan untuk kasus penggunaan saya adalah *.*. Ekspresi yang lebih kuat akan membuat ini menjadi jawaban yang lebih baik.
TecBrat
50

Gaya SPL :

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

Periksa kelas DirectoryIterator dan SplFileInfo untuk daftar metode yang tersedia yang dapat Anda gunakan.

Ilija
sumber
Cara yang bagus untuk mendapatkan file dan hanya nama mereka, bukan seluruh jalur, terima kasih!
Chris
1
Iya. Untuk jalur lengkap, Anda dapat menggunakan getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ilija
18

Anda perlu mengapitnya $file = readdir($handle)dengan tanda kurung.

Ini dia:

$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
sumber
14

Gunakan saja glob('*'). Berikut Dokumentasi

Fletcher Moore
sumber
14

Karena jawaban yang diterima memiliki dua kekurangan penting, saya memposting jawaban yang ditingkatkan untuk pendatang baru yang mencari jawaban yang benar:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. Memfilter globehasil fungsi dengan is_filediperlukan, karena ini mungkin mengembalikan beberapa direktori juga.
  2. Tidak semua file memiliki .nama, jadi */*pola secara umum menyebalkan.
Aliweb
sumber
Ini adalah eksekusi bersih yang berhasil untuk saya. Jawaban sebelumnya menunjukkan direktori dalam hasil yang tidak saya inginkan.
AWP
Anda, Pak, perlu lebih banyak suara positif! Sebenarnya (di windows) saya harus menggunakan basename($file)hanya untuk mendapatkan nama file, bukan seluruh jalur dengan nama file.
Pauloco
11

Saya memiliki kode yang lebih kecil untuk melakukan ini:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}
YooRich.com
sumber
Mengembalikan semua file kecuali dua file sampah bernama "." dan "..". Saya tidak memiliki file dengan nama "." dan ".." di direktori saya.
kamranbhatti585
1
Gunakan $ files = array_diff (scandir ($ path), array ('.', '..')); untuk membebaskan kesalahan di atas yang saya bahas.
kamranbhatti585
Bagus. bagaimana cara menghapus ekstensi untuk file? (Saya perlu menghapus .phppada setiap file.)
KSPR
8

Pada beberapa OS yang Anda dapatkan . ..dan .DS_Store, Kami tidak dapat menggunakannya, jadi mari kita sembunyikan.

Pertama mulai dapatkan semua informasi tentang file, menggunakan 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>";
    }
}
Profesor Gila
sumber
4

Ini karena prasyarat operator. Coba ubah menjadi:

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

glob()dan FilesystemIteratorcontoh:

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

Anda bisa mencoba scandir(Path)fungsinya. itu cepat dan mudah diterapkan

Sintaksis:

$files = scandir("somePath");

Fungsi ini mengembalikan daftar file menjadi Array.

untuk melihat hasilnya, anda bisa mencoba

var_dump($files);

Atau

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

Berikut contoh lebih lanjut untuk menampilkan semua file dalam folder

m1crdy.dll
sumber
Anda harus menunjukkan kode di sini dan memberikan referensi padanya.
kamranbhatti585
0

Saya hanya menggunakan kode ini:

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

Kode rekursif untuk menjelajahi semua file yang ada dalam direktori ('$ path' berisi jalur direktori):

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
            */
        }
    }
}
Goel Prashant
sumber