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.