รับชื่อไฟล์ทั้งหมดในไดเร็กทอรีด้วย PHP


87

ด้วยเหตุผลบางประการฉันจึงได้รับ '1' สำหรับชื่อไฟล์ที่มีรหัสนี้:

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

เมื่อฉันสะท้อนแต่ละองค์ประกอบใน $ results_array ฉันจะได้ '1 จำนวนมากไม่ใช่ชื่อของไฟล์ ฉันจะตั้งชื่อไฟล์ได้อย่างไร?


1
มีไม่กี่ตัวเลือกใช้เป็นglob
allnightgrocery


1
ปัญหาที่ผู้โพสต์มีคืองานมีลำดับความสำคัญต่ำมากดังนั้นตัวดำเนินการ "! ==" จะได้รับการประเมินก่อนจากนั้นผลลัพธ์ไบนารีของการดำเนินการนั้นจะถูกกำหนดให้กับ $ file สิ่งเดียวที่จำเป็นคือการใช้ ($ file = readdir ($ handle))! == FALSE "
61


จาก 69 โหวตเป็น 70 ฉันรู้สึกว่าตรงกันข้ามกับแฮงค์มูดี้
ชาร์ลี

คำตอบ:


169

อย่ากังวลกับ open / readdir และใช้globแทน:

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

24
คุณอาจต้องการarray_filter(..., 'is_file')ล้อมรอบโลกนั้นเนื่องจากคำถามถามหาไฟล์
ถวายพระพร

23
ไม่ใช่ทุกชื่อไฟล์ที่มีรูปแบบ*.*: เพียงใช้*แทน
jameshfisher

เราจะรับไฟล์ทั้งหมดในรายการนามสกุลได้อย่างไร? เช่นถ้าเราต้องการไฟล์. php และ. js ทั้งหมด?
Nis

3
ใช่คำตอบนี้ไม่ได้มีประสิทธิภาพมากนัก something.somethingไฟล์ที่ไม่จำเป็นต้องมีส่วนขยายและไดเรกทอรีสามารถตั้งชื่อ จะดีกว่าที่จะใช้array_filterและglob($log_directory.'/*').
แอนดรูว์

ฉัน upvoted *.*นี้เพราะผมเพียงแค่ต้องการคำตอบที่ง่ายและไฟล์ทั้งหมดที่เกี่ยวข้องสำหรับกรณีการใช้งานของฉันจะเป็น การแสดงออกที่ชัดเจนยิ่งขึ้นจะทำให้คำตอบนี้ดียิ่งขึ้น
TecBrat

50

สไตล์SPL :

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

ตรวจสอบคลาสDirectoryIteratorและSplFileInfoสำหรับรายการวิธีการที่มีอยู่ที่คุณสามารถใช้ได้


วิธีที่ยอดเยี่ยมในการรับไฟล์เพียงชื่อแทนที่จะเป็นเส้นทางทั้งหมดขอบคุณ!
คริส

1
ใช่. สำหรับเส้นทางแบบเต็มคุณสามารถใช้getPathname: php.net/manual/en/splfileinfo.getpathname.php
Ilija

18

คุณต้องล้อมรอบ$file = readdir($handle)ด้วยวงเล็บ

ได้แล้ว:

$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

เนื่องจากคำตอบที่ยอมรับมีข้อบกพร่องที่สำคัญสองประการฉันจึงโพสต์คำตอบที่ปรับปรุงแล้วสำหรับผู้มาใหม่ที่กำลังมองหาคำตอบที่ถูกต้อง:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. การกรองglobeผลลัพธ์ของฟังก์ชันด้วยis_fileเป็นสิ่งที่จำเป็นเนื่องจากอาจส่งคืนไดเรกทอรีบางรายการเช่นกัน
  2. ไม่ใช่ทุกไฟล์ที่มี.ในชื่อดังนั้น*/*รูปแบบโดยทั่วไปจึงไม่ดี

นี่คือการดำเนินการที่สะอาดที่ได้ผลสำหรับฉัน คำตอบก่อนหน้านี้แสดงไดเร็กทอรีในผลลัพธ์ที่ฉันไม่ต้องการ
AWP

คุณต้องการคะแนนโหวตมากขึ้น! จริงๆแล้ว (บน windows) ฉันต้องใช้basename($file)เพื่อรับเฉพาะชื่อไฟล์แทนที่จะเป็นพา ธ ทั้งหมดที่มีชื่อไฟล์
Pauloco

11

ฉันมีรหัสที่เล็กกว่าที่ต้องทำสิ่งนี้:

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

ส่งคืนไฟล์ทั้งหมดให้ฉัน แต่มีไฟล์ขยะสองไฟล์ชื่อ "." และ ".. ". ฉันไม่มีไฟล์ชื่อ "." และ ".. " ในไดเรกทอรีของฉัน
kamranbhatti585

1
ใช้ $ files = array_diff (scandir ($ path), array ('.', '.. ')); เพื่อปลดปล่อยข้อผิดพลาดข้างต้นที่ฉันพูดถึง
kamranbhatti585

ดี. ฉันจะลบนามสกุลของไฟล์ได้อย่างไร? (ฉันต้องการลบ.phpในแต่ละไฟล์)
KSPR

8

ในบางระบบปฏิบัติการที่คุณได้รับ. ..และ.DS_Storeเราไม่สามารถใช้งานได้ดังนั้นเรามาซ่อนมันกันเถอะ

เริ่มแรกรับข้อมูลทั้งหมดเกี่ยวกับไฟล์โดยใช้ 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

มันเป็นเพราะความแม่นยำของผู้ปฏิบัติงาน ลองเปลี่ยนเป็น:

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

2

glob()และFilesystemIteratorตัวอย่าง:

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

คุณสามารถลองใช้scandir(Path)ฟังก์ชัน มันรวดเร็วและใช้งานง่าย

ไวยากรณ์:

$files = scandir("somePath");

ฟังก์ชันนี้จะส่งคืนรายการไฟล์ใน Array

เพื่อดูผลลัพธ์คุณสามารถลอง

var_dump($files);

หรือ

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

1

อีกวิธีหนึ่งในการแสดงรายการไดเรกทอรีและไฟล์จะใช้คำRecursiveTreeIteratorตอบที่นี่: https://stackoverflow.com/a/37548504/2032235 https://stackoverflow.com/a/37548504/2032235

สามารถดูคำอธิบายRecursiveIteratorIteratorและตัววนซ้ำใน PHP ได้ที่นี่: https://stackoverflow.com/a/12236744/2032235


0

ฉันใช้รหัสนี้:

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

รหัสเรียกซ้ำเพื่อสำรวจไฟล์ทั้งหมดที่อยู่ในไดเร็กทอรี ('$ path' มีพา ธ ของไดเร็กทอรี):

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
            */
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.