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?


1
Ada beberapa opsi menggunakan glob .
— allnightgrocery


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

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


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


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.

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

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

4

Ini karena prasyarat operator. Coba ubah menjadi:

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

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

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



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


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
            */
        }
    }
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.