ไฟล์ทั้งหมดจากโฟลเดอร์ php รับรายการโฟลเดอร์โดยใช้ PHP ลองใช้ตัววนซ้ำ SPL

สแกนเดอร์ - รับรายการไฟล์และไดเร็กทอรีที่อยู่ในเส้นทางที่ระบุ

คำอธิบาย

อาร์เรย์ สแกนเดอร์ (สตริง $directory [, int $sorting_order = SCANDAR_SORT_ASCENDING [, ทรัพยากร $บริบท ]])

การส่งคืน อาร์เรย์ซึ่งมีชื่อของไฟล์และไดเร็กทอรีที่อยู่ตามเส้นทางที่ส่งผ่านในพารามิเตอร์ไดเร็กทอรี

รายการพารามิเตอร์

แคตตาล็อกที่จะสแกน

การเรียงลำดับ_ลำดับ

ตามค่าเริ่มต้น การเรียงลำดับจะดำเนินการตามลำดับตัวอักษรจากน้อยไปหามาก หากตั้งค่าพารามิเตอร์เสริม sorting_order เป็น SCANDAR_SORT_DESCENDINGโดยจะเรียงลำดับตามตัวอักษรจากมากไปน้อย ถ้าจะตั้งเป็น SCANDAR_SORT_NONEจากนั้นจะไม่มีการเรียงลำดับ

บริบท

สำหรับคำอธิบายของพารามิเตอร์บริบท โปรดดูส่วน "หัวข้อ" ของคู่มือนี้

ส่งกลับค่า

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

รายการการเปลี่ยนแปลง

ตัวอย่าง

ตัวอย่างที่ 1 ตัวอย่างง่ายๆ ของการใช้ฟังก์ชัน สแกนเดอร์()

$dir = "/tmp" ;
$files1 = สแกนดิร์($dir);
$files2 = สแกนดิร์($dir, 1);

Print_r($files1);
print_r($files2);
?>

ผลลัพธ์ของการรันตัวอย่างนี้จะเป็นดังนี้:

อาร์เรย์ ( => . => .. => bar.php => foo.txt => somedir) อาร์เรย์ ( => somedir => foo.txt => bar.php => .. => .)

ตัวอย่าง #2 ตัวเลือกฟังก์ชันทางเลือก สแกนเดอร์()สำหรับ PHP4

$dir = "/tmp" ;
$dh = opendir($dir);
ในขณะที่ (false !== ($filename = readdir ($dh ))) (
$files = $ชื่อไฟล์ ;
}

จัดเรียง($ไฟล์);

Print_r($ไฟล์);

เรียงลำดับ($ไฟล์);

Print_r($ไฟล์);

การทำงานกับไฟล์

ความจำเป็นในการดำเนินงานกับไฟล์มักเผชิญหน้ากับโปรแกรมเมอร์ หากสคริปต์ของคุณไม่ได้ใช้ฐานข้อมูล ไฟล์จะเป็นอุปกรณ์จัดเก็บข้อมูลเพียงตัวเดียวที่ยอมรับได้สำหรับสคริปต์ การใช้ไฟล์เป็นที่เก็บข้อมูลการเรียกใช้สคริปต์ทำให้สามารถใช้งานได้ในสถานการณ์ที่หลากหลาย สคริปต์ตอบโต้เกือบทั้งหมดสำหรับบางสิ่งเขียนขึ้นจากการทำงานกับไฟล์ คุณยังสามารถยกตัวอย่างอื่นๆ ได้อีกมากมาย แต่ถึงเวลาที่ต้องเปลี่ยนจากคำพูดไปสู่การกระทำโดยตรง

ฉันอยากจะบอกทันทีว่าต้องได้รับอนุญาตในการทำงานกับไฟล์ ตามค่าเริ่มต้น PHP ไม่อนุญาตให้มีการจัดการไฟล์ด้วยเหตุผลด้านความปลอดภัย หากต้องการลบการแบนนี้ในตัวจัดการ CuteFTP FTP ให้ทำเครื่องหมายในช่องทั้งหมดในคุณสมบัติไฟล์ ผู้จัดการรายอื่นควรมีสิ่งที่คล้ายคลึงกัน

แฟ้มที่มีอยู่

ก่อนที่คุณจะดำเนินการกับไฟล์ คุณมักจะต้องตรวจสอบให้แน่ใจว่ามีไฟล์ที่ระบุอยู่ด้วย นี่คือสิ่งที่ฟังก์ชัน file_exists ทำ ฟังก์ชันนี้สามารถคืนค่าได้เพียงสองค่าเท่านั้น ดังที่คุณจะจินตนาการได้ จริง(หากมีไฟล์ที่ระบุอยู่) และ เท็จ- โดยปกติแล้ว การใช้ฟังก์ชันนี้จะมีลักษณะดังนี้:

โปรดทราบว่าฟังก์ชั่นนี้ใช้ได้กับไฟล์ในเครื่องเท่านั้นนั่นคือหากคุณต้องการตรวจสอบว่า Yandex ได้รับไฟล์ robot.txt หรือไม่ความพยายามของคุณจะไร้ผล แต่คุณสามารถตรวจสอบไฟล์ใด ๆ ที่อยู่บนเซิร์ฟเวอร์ภายในเครื่องได้ โดยไม่คำนึงถึงไดเรกทอรีของที่ตั้ง

ต่อไปนี้เป็นกฎบางประการสำหรับการอธิบายเส้นทางไปยังไฟล์

ขนาดไฟล์

ตามชื่อที่แนะนำ ฟังก์ชันจะกำหนดขนาดไฟล์และส่งกลับเป็นไบต์ มีประโยชน์หากคุณต้องการตรวจสอบไฟล์เพื่อดูว่ามีข้อมูลหรือไม่ (ดังที่คุณอาจจินตนาการได้ว่าไฟล์ว่างมีขนาด 0 ไบต์) และยังสามารถตรวจสอบขนาดไฟล์เพื่อดูว่าเกินขีดจำกัดที่กำหนดได้หรือไม่

ไฟล์

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

นอกจากนี้ยังสามารถรวมองค์ประกอบทั้งหมดของอาร์เรย์ที่ส่งคืนให้เป็นตัวแปรเดียวได้อีกด้วย ทำได้โดยใช้ฟังก์ชันอาร์เรย์ระเบิด

โฟเพน

หากฟังก์ชันก่อนหน้านี้มีอยู่ในตัวเองและโดยทั่วไปไม่เกี่ยวข้องกับฟังก์ชันอื่นๆ ฟังก์ชันที่ตามมาสำหรับการทำงานกับไฟล์จะทำงานร่วมกับ fopen ฟังก์ชันนี้เปิดไฟล์ที่ระบุและส่งคืนตัวระบุการเชื่อมต่อไฟล์ซึ่งใช้เพื่อการบริการ ฟังก์ชันนี้ไม่เกี่ยวข้องกับเนื้อหาของไฟล์แต่อย่างใด

ฟังก์ชั่น fopen มีหลายโหมดสำหรับการทำงานกับไฟล์ โดยจะระบุไว้หลังชื่อไฟล์และมีดังต่อไปนี้:

    "ร"
    ไฟล์นี้เปิดขึ้นเพื่ออ่านเนื้อหาเท่านั้น

    "ร+"
    การเปิดไฟล์ทั้งการอ่านและการเขียน

    "ว"
    ไฟล์ถูกเปิดเพื่อวัตถุประสงค์ในการเขียน

    "ว+"
    เปิดไฟล์เพื่ออ่านและเขียน

    "ก"
    ไฟล์ถูกเปิดเพื่อเขียนต่อท้ายไฟล์ (ต่อท้าย)

    "เอ+"
    เปิดให้เขียนและอ่านเพิ่มเติม

fgets

ฟังก์ชันสำหรับอ่านไฟล์ที่เปิดโดยฟังก์ชัน fopen แต่แตกต่างจากไฟล์ตรงที่ฟังก์ชันนี้จะส่งคืนไฟล์เพียงบรรทัดเดียวในแต่ละครั้งที่มีการดำเนินการ และจะย้ายตัวชี้ไฟล์ภายในไปยังบรรทัดถัดไป ซึ่งจะถูกอ่านในครั้งถัดไปที่มีการเรียกใช้ฟังก์ชัน ดังนั้นหากคุณต้องการอ่านไฟล์ทั้งหมด คุณต้องใช้ฟังก์ชันนี้แบบวนซ้ำ

โปรดทราบว่าฟังก์ชัน fgets ใช้พารามิเตอร์ความยาวเพิ่มเติม ซึ่งระบุความยาวสูงสุดของบรรทัดไฟล์ที่จะอ่าน หากขนาดของสตริงเกินจำนวนนี้ ฟังก์ชันจะส่งคืนสตริงในรูปแบบไบต์ที่มีความยาว "ตัดทอน" โดยค่าเริ่มต้น พารามิเตอร์นี้ถูกตั้งค่าเป็น 1024 ไบต์ หรือหนึ่งกิโลไบต์ โดยเฉพาะอย่างยิ่งให้ความสนใจกับพารามิเตอร์นี้หากคุณใช้ไฟล์ขนาดใหญ่เนื่องจากเมื่ออ่านไฟล์ดังกล่าวบัฟเฟอร์การดำเนินการ PHP อาจล้น (ขนาดระบุไว้ในไฟล์กำหนดค่า) ซึ่งจะนำไปสู่การหยุดทำงาน

โปรดทราบว่าไฟล์ที่จะอ่านไม่ใช่ชื่อไฟล์ แต่เป็นตัวระบุการเชื่อมต่อไฟล์ที่ส่งคืนโดยฟังก์ชัน fopen (ในตัวอย่างของเรา ค่าของตัวแปร $file)

fputs

ฟังก์ชั่นการเขียนข้อมูลลงไฟล์และเป็นไปตามหลักการทำงานของฟังก์ชัน fget นั่นคือเริ่มเขียนจากตำแหน่งของตัวชี้ไฟล์ภายใน โดยทั่วไป ฟังก์ชันนี้จะคล้ายกับฟังก์ชันข้างต้นหลายประการ: นอกจากนี้ยังใช้พารามิเตอร์ความยาวข้อมูลการเขียน ซึ่งเป็นทางเลือกเช่นกัน

ปิด

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

เพื่อแสดงให้เห็นการรวมกันของฟังก์ชันข้างต้น เราจะยกตัวอย่างการสร้างตัวนับการเข้าชมแบบง่าย

$file = fopen("counter.txt", "r");
$c = fgets($ไฟล์, 150);
fclose($ไฟล์);
$c++;
$file = fopen("counter.txt", "w");
fputs($ไฟล์, $c);
fclose($ไฟล์);
เสียงสะท้อน $c;
?>

การทำงานกับไดเร็กทอรี

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

opendir

ฟังก์ชันนี้เปิดไดเร็กทอรีที่ระบุและส่งกลับตัวระบุบริการสำหรับการเชื่อมต่อไดเร็กทอรี เส้นทางไดเร็กทอรีควรระบุดังนี้:

จุดหมายถึงการเปิดไดเร็กทอรีปัจจุบัน

. /ไฟล์/

กำลังเปิดโฟลเดอร์ ไฟล์อยู่ในไดเร็กทอรีปัจจุบัน

กำลังเปิดโฟลเดอร์ให้สูงกว่าระดับปัจจุบันหนึ่งระดับ

อ่านไดร์

ฟังก์ชั่นอ่านไดเร็กทอรีที่เปิดโดย opendir สำหรับการผ่านแต่ละครั้ง จะส่งคืนชื่อของไฟล์หรือโฟลเดอร์ที่อยู่ในไดเร็กทอรีที่ระบุ และย้ายตัวชี้ภายในไปยังออบเจ็กต์ไดเร็กทอรีถัดไป ดังนั้นหากต้องการอ่านไดเร็กทอรีทั้งหมดจะต้องใช้แบบวนซ้ำ

ควรสังเกตว่าฟังก์ชันนี้ส่งคืนออบเจ็กต์บริการโฟลเดอร์ . และ .. ซึ่งสามารถตัดแต่งได้เมื่อส่งออกด้วยคำสั่ง IF

ปิดแล้ว

เราปิดไดเร็กทอรีโดยระบุตัวระบุการเชื่อมต่อโฟลเดอร์เป็นอาร์กิวเมนต์

บางครั้งการใช้ฟังก์ชันไดเร็กทอรีทำให้ชีวิตง่ายขึ้นมาก ตัวอย่างเช่น ในส่วนคุณลักษณะ คุณสามารถดูรายการคุณลักษณะตามลำดับตัวอักษรได้ คุณลองจินตนาการดูว่าจะต้องใช้เวลานานเท่าใดในการเขียนรายการทั้งหมดนี้พร้อมลิงก์ด้วยตนเอง และแม้แต่ตามลำดับตัวอักษร และนี่คือจุดที่ฟังก์ชั่นการทำงานกับไดเร็กทอรีช่วยฉันได้ แต่ละฟังก์ชันถูกวางไว้ในไฟล์แยกกันโดยมีชื่อตรงกับชื่อของฟังก์ชัน โดยไม่มีนามสกุลใดๆ

ดังนั้นทุกครั้งที่คุณเยี่ยมชมเพจ คุณจะได้รับรายการฟังก์ชันที่สร้างขึ้นใหม่

นั่นคือทั้งหมดที่ เจอกันใหม่ในบทเรียนหน้าครับ

Reg.ru: โดเมนและโฮสติ้ง

นายทะเบียนและผู้ให้บริการโฮสติ้งที่ใหญ่ที่สุดในรัสเซีย

มีชื่อโดเมนมากกว่า 2 ล้านชื่อที่ให้บริการ

โปรโมชั่น เมลโดเมน โซลูชั่นทางธุรกิจ

ลูกค้ามากกว่า 700,000 รายทั่วโลกได้ตัดสินใจเลือกแล้ว

*เลื่อนเมาส์ไปเหนือเพื่อหยุดการเลื่อนชั่วคราว

กลับไปข้างหน้า

รับรายการโฟลเดอร์โดยใช้ PHP

การแสดงรายการไดเร็กทอรีโดยใช้ PHP หรือไดเร็กทอรีรายการ

เราจะเรียกไดเร็กทอรีที่แสดงรายการแบบสอบถามทั่วไปที่สร้างรายการไฟล์และไดเร็กทอรีทั้งหมดหรือบางส่วนจากไดเร็กทอรีหลัก ซึ่งเป็นกระบวนการที่คล้ายกับการทำงานของหน้าดัชนีที่จัดทำโดยเว็บเซิร์ฟเวอร์ส่วนใหญ่ แต่ด้วย โอควบคุมเนื้อหาและการจัดรูปแบบได้ดีขึ้น

ข้อดีอีกประการของสคริปต์นี้คือความสามารถในการดำเนินการบางอย่างกับไฟล์โดยใช้ PHP ไม่ว่าในกรณีใด ขั้นตอนแรกที่เราต้องทำคือสืบค้นระบบไฟล์ - ส่งคืนรายการไฟล์และไดเร็กทอรี

ฟังก์ชันที่แสดงด้านล่างนี้ช่วยให้คุณสามารถแยกชื่อไฟล์และคุณสมบัติอื่นๆ ออกจากไดเร็กทอรีเฉพาะ หรือทำซ้ำตามหมวดหมู่ย่อยแบบวนซ้ำ

ความคิดเห็น: PHP5 มีฟังก์ชัน สแกนเดอร์ซึ่ง “ส่งคืนรายการไฟล์และไดเร็กทอรีภายในไดเร็กทอรีตามเส้นทางที่กำหนด” แต่จะไม่แสดงข้อมูลเพิ่มเติมเกี่ยวกับไฟล์ภายในไดเร็กทอรี

แสดงรายการหนึ่งไดเรกทอรี

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

read())) ( // ข้ามไฟล์ที่ซ่อน if($entry == ".") ดำเนินการต่อ; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); ) elseif(is_readable("$dir$entry")) ( $retval = array("name" = > "$dir$entry", "size" => ขนาดไฟล์("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->ปิด(); ส่งคืน $retval; -

คุณสามารถใช้ฟังก์ชันนี้ได้ดังนี้:

ค่าที่ส่งคืนคืออาร์เรย์ที่เชื่อมโยงของไฟล์ รวมถึงข้อมูลพาธของไฟล์ ขนาด และวันที่แก้ไขครั้งล่าสุด เว้นแต่ว่าไฟล์นั้นจะเป็นไดเร็กทอรี ซึ่งในกรณีนี้สตริง "(dir)" จะปรากฏขึ้นแทนขนาดไฟล์

ตัวอย่างที่ 1:

",print_r($dirlist),""; /* ตัวอย่างเอาต์พุต Array ( => Array ( => images/พื้นหลัง0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

ตัวอย่างที่ 2:

",print_r($dirlist),""; /* ตัวอย่างเอาต์พุต Array ( => Array ( => ./images/พื้นหลัง0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

การแสดงรายการไฟล์ผ่าน HTML

เพื่อให้ได้ผลลัพธ์ที่ออกมาบนหน้าในรูปแบบ HTML เราจะวนซ้ำอาร์เรย์ที่ส่งคืน

\n"; เอคโค่ " ชื่อพิมพ์ขนาดรุ่นสุดท้าย\n"; foreach($dirlist as $file) ( echo " \n"; เอคโค่ " ($ไฟล์["ชื่อ"])\n"; เอคโค่ " ($ไฟล์["ประเภท"])\n"; เอคโค่ " ($ไฟล์["ขนาด"])\n"; เอคโค่ " \n"; เอคโค่ "\n"; ) เสียงสะท้อน "\n\n"; ?>

รหัสนี้แก้ไขได้ง่ายมาก เช่น:

  • - แสดงผลรายการเป็นรายการแทนตาราง
  • - ทำให้ชื่อไฟล์ลิงก์ใช้งานได้
  • - เปลี่ยนชื่อด้วยไอคอนตามประเภทของไฟล์
  • ฯลฯ

ตัวอย่างเช่น หากต้องการส่งออกเฉพาะไฟล์ PNG ให้เพิ่มเงื่อนไขง่ายๆ ให้กับลูปเอาต์พุต:

\n"; เอคโค่ " ชื่อพิมพ์ขนาดรุ่นสุดท้าย\n"; foreach($dirlist as $file) ( //ตรวจสอบว่าไฟล์นั้นเป็น PNG หรือไม่ if(!preg_match("/\.png$/", $file["name"])) Continue; echo " \n"; เอคโค่ " ($ไฟล์["ชื่อ"])\n"; เอคโค่ " ($ไฟล์["ประเภท"])\n"; เอคโค่ " ($ไฟล์["ขนาด"])\n"; เอคโค่ " ",วันที่("r", $file["lastmod"]),"\n"; เอคโค่ "\n"; ) เสียงสะท้อน "\n\n"; ?>

ตัวอย่างนี้จะข้ามและซ่อนไฟล์ทั้งหมดที่มีชื่อลงท้ายด้วย .png- คุณยังสามารถใช้เงื่อนไขเพิ่มเติมตามประเภทไฟล์ ขนาด หรือวันที่ที่แก้ไขครั้งล่าสุดได้

ตัวอย่างเช่น หากคุณต้องการแสดงภาพขนาดย่อ ลิงก์ไปยังรูปภาพขนาดใหญ่ หรือแม้แต่วิดีโอ เพียงแค่ตั้งชื่อไฟล์ 2 ไฟล์นี้ให้เหมือนกัน และในสคริปต์ด้านบนให้ใช้ str_แทนที่หรือฟังก์ชันที่คล้ายกันเพื่อแก้ไขเนื้อหาของลิงก์

รายการไดเรกทอรีแบบเรียกซ้ำ

และเนื่องจากเรามาไกลขนาดนี้ จะมีการเปลี่ยนแปลงเพียงเล็กน้อยในรายการแบบเรียกซ้ำและฟังก์ชันการเรียกประเภทย่อย ด้วยการเพิ่มพารามิเตอร์ตัวที่สองให้กับฟังก์ชัน เราจะยังคงรักษาฟังก์ชันก่อนหน้าของการแสดงรายการไดเร็กทอรีเดียว

read())) ( // ข้ามไฟล์ที่ซ่อน if($entry == ".") ดำเนินการต่อ; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( $retval = array_merge($ retval, getFileList("$dir$entry/", true) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size " => ขนาดไฟล์("$dir$entry"), "lastmod" => filemtime("$dir$entry")); ) $d->ปิด(); ส่งคืน $retval; -

เพื่อให้ฟังก์ชันการทำงานใหม่ทำงานได้ คุณต้องป้อนค่า จริง(หรือ 1) เป็นพารามิเตอร์ตัวที่สอง

ก่อนที่จะเรียกสคริปต์ซ้ำ ให้ตรวจสอบว่าไดเร็กทอรีย่อยสามารถอ่านได้หรือไม่ และอ่านย่อหน้าสุดท้ายของบทเรียนนี้ด้วย เพื่อหลีกเลี่ยงข้อผิดพลาดในการเข้าถึง

เช่นเดียวกับเมื่อก่อน ค่าที่ส่งคืนจะเป็นอาร์เรย์ ซึ่งเป็นอาร์เรย์ที่เชื่อมโยง ที่จริงแล้ว การเพิ่มเพียงอย่างเดียวคืออีกตัวเลือกเพิ่มเติมสำหรับรายการแบบเรียกซ้ำ

ขีดจำกัดความลึกของการเรียกซ้ำ

ตัวอย่างสุดท้ายนี้เพิ่มคุณสมบัติอีกหนึ่งอย่าง - ความสามารถในการระบุว่าการเรียกซ้ำควร "ลึก" แค่ไหน โค้ดก่อนหน้านี้จะยังคงสำรวจไดเร็กทอรีย่อยต่อไปจนกว่าจะหมด สคริปต์นี้จะช่วยคุณกำหนดขีดจำกัดจำนวนระดับของไดเร็กทอรีที่ซ้อนกัน

read())) ( // ข้ามไฟล์ที่ซ่อน if($entry == ".") ดำเนินการต่อ; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ entry/", "size" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( if($ความลึก == = false) ( $retval = array_merge($retval, getFileList("$dir$entry/", true)); ) elseif($ความลึก > 0) ( $retval = array_merge($retval, getFileList("$dir$entry /", true, $deep-1)); ) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size" => ขนาดไฟล์("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->ปิด(); ส่งคืน $retval; -

เช่นเคย เราได้เพิ่มพารามิเตอร์ใหม่เพียง 1 ตัวและโค้ดสองสามบรรทัด หากไม่ได้ระบุค่าเริ่มต้นที่รับผิดชอบสำหรับความลึกของการเรียกซ้ำ ค่านั้นจะถูกตั้งค่าเป็น เท็จ- สิ่งนี้ช่วยให้เรามั่นใจได้ว่าคุณสมบัติก่อนหน้านี้ยังคงอยู่และโค้ดที่ตามมาจะไม่ "เสียหาย" เมื่อฟังก์ชันเปลี่ยนแปลง

ในบทนี้ เราจะจัดการกับงานทั่วไปที่เกิดขึ้นขณะทำงานในโครงการ PHP ซึ่งก็คือการรับรายการไฟล์และไดเร็กทอรี เราจะหารือถึงแนวทางพื้นฐานและซับซ้อนยิ่งขึ้นหลายประการ โดยระบุข้อดีและข้อเสียของแต่ละวิธี โซลูชันสามรายการแรกจะใช้ฟังก์ชัน PHP มาตรฐาน จากนั้นเราจะแนะนำโซลูชันที่มีประสิทธิภาพมากขึ้นโดยใช้ตัววนซ้ำ SPL

สำหรับการอภิปรายที่สำคัญเกี่ยวกับโซลูชันและการสาธิต เราจะถือว่าโครงสร้างไดเร็กทอรีเป็นดังนี้:

\---ผู้จัดการ | \---ผู้ใช้ | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

โซลูชั่นพื้นฐาน

วิธีแก้ปัญหาชุดแรกนั้นขึ้นอยู่กับการใช้ฟังก์ชัน glob() ซึ่งเป็นการรวมกันของฟังก์ชัน opendir() , readdir() และ closeir() และฟังก์ชัน scandir()

การใช้โกลบอล()

วิธีแก้ปัญหาแรกนั้นขึ้นอยู่กับการใช้ฟังก์ชัน glob() ซึ่งช่วยให้คุณค้นหาเส้นทางโดยใช้รูปแบบได้ ฟังก์ชันนี้มีพารามิเตอร์สองตัว:

  • $pattern (จำเป็น): รูปแบบการค้นหา
  • $flags (เป็นทางเลือก): หนึ่งหรือหลายธง คำอธิบายสามารถพบได้ในเอกสารประกอบ

ลองดูตัวอย่าง เพื่อค้นหาไดเร็กทอรีสำหรับไฟล์และไดเร็กทอรีทั้งหมดที่มีชื่อลงท้ายด้วย .txtคุณควรใช้รหัส:

หากเราแสดงตัวแปร $filelist เราจะได้:

อาร์เรย์ (0 => "article.txt", 1 => "text.txt")

หากคุณต้องการรายชื่อไฟล์และไดเร็กทอรีที่ชื่อขึ้นต้นด้วย "te" โค้ดจะมีลักษณะดังนี้:

และผลลัพธ์ดูเหมือนว่า:

อาร์เรย์ (0 => "test.dat", 1 => "text.txt")

และหากต้องการรับรายการเฉพาะไดเร็กทอรีที่มีชื่อประกอบด้วย "ma" ให้ใช้โค้ด:

ตัวอย่างสุดท้ายจะแสดงผล:

อาร์เรย์ (0 => "ผู้จัดการ")

โปรดทราบว่าตัวอย่างสุดท้ายใช้แฟล็ก GLOB_ONLYDIR เป็นพารามิเตอร์ตัวที่สองของฟังก์ชัน ดังนั้นไฟล์ master.dat จึงถูกแยกออกจากรายการ แม้ว่าฟังก์ชัน glob() จะใช้งานง่ายมาก แต่บางครั้งก็ไม่ยืดหยุ่นเพียงพอ ตัวอย่างเช่น ไม่มีแฟล็กที่จะรับเฉพาะไฟล์ (ไม่มีไดเร็กทอรี) ที่ตรงกับรูปแบบ

เราใช้ opendir() , readdir() และ closeir()

วิธีที่สองในการรับรายการไฟล์และไดเร็กทอรีที่เราจะพูดถึงคือการใช้ฟังก์ชัน opendir() , readdir() และ closeir()

ฟังก์ชัน opendir() จะเปิดไดเร็กทอรีและส่งคืนหมายเลขอ้างอิงการเชื่อมต่อ เมื่อได้รับหมายเลขอ้างอิงแล้ว คุณจะสามารถใช้ฟังก์ชัน readdir() ได้ ในแต่ละการโทร ฟังก์ชันนี้จะส่งคืนชื่อของไฟล์หรือไดเร็กทอรีถัดไปภายในไดเร็กทอรีที่เปิดอยู่ หากแสดงชื่อทั้งหมดแล้ว ฟังก์ชันจะส่งกลับ เท็จ- ฟังก์ชัน Closedir() ใช้สำหรับปิดที่จับ

วิธีนี้แตกต่างจากการใช้ฟังก์ชัน glob() เนื่องจากคุณไม่มีพารามิเตอร์ที่จะช่วยกรองรายการไฟล์และชื่อไดเรกทอรีที่ส่งคืน คุณต้องทำการกรองด้วยตัวเองเพื่อให้ได้ผลลัพธ์ที่คุณต้องการ

ตัวอย่างต่อไปนี้ส่งคืนรายการไฟล์และชื่อไดเรกทอรีที่ขึ้นต้นด้วย “te”:

เมื่อรันโค้ดข้างต้น ตัวแปร $entry จะมีการรวมเช่น “” และ "..". นี่คือไดเร็กทอรีเสมือนสองไดเร็กทอรีที่มีอยู่ในทุกไดเร็กทอรีของระบบไฟล์ เป็นตัวแทนของไดเร็กทอรีปัจจุบันและไดเร็กทอรีหลักตามลำดับ

ตัวอย่างที่สองแสดงเฉพาะไฟล์ที่อยู่ในไดเร็กทอรีที่กำหนด

ตัวอย่างจะสร้างสิ่งต่อไปนี้:

อาร์เรย์ (0 => "article.txt", 1 => "master.dat", 2 => "script.php", 3 => "test.dat", 4 => "text.txt")

การใช้ scandir()

สุดท้ายนี้ เรามาแนะนำฟังก์ชัน scandir() กันดีกว่า มีพารามิเตอร์ที่จำเป็นเพียงตัวเดียวเท่านั้น: เส้นทางการอ่าน ฟังก์ชันส่งคืนอาร์เรย์ของไฟล์และไดเร็กทอรีที่อยู่ในเส้นทางที่ระบุ หากต้องการรับรายการไฟล์และไดเร็กทอรีตามเกณฑ์เฉพาะ คุณต้องทำการกรองเพิ่มเติม ในทางกลับกัน วิธีแก้ปัญหาจะกระชับกว่าและไม่ต้องการการจัดการที่จับ

ตัวอย่างนี้แสดงวิธีรับรายการไฟล์และไดเร็กทอรีที่ชื่อขึ้นต้นด้วย "te":

ลองใช้ตัววนซ้ำ SPL

ตอนนี้เรามาดูการใช้ตัววนซ้ำ SPL แต่ก่อนที่เราจะเริ่มแก้ไขปัญหา เรามาแนะนำไลบรารี SPL และตัววนซ้ำก่อน ไลบรารี SPL จัดให้มีชุดของคลาสสำหรับโครงสร้างข้อมูลเชิงวัตถุ ตัววนซ้ำ ตัวอธิบายไฟล์ และอื่นๆ

ข้อดีประการหนึ่งของตัววนซ้ำคือเป็นคลาสและสามารถขยายได้เพื่อให้เหมาะกับความต้องการของคุณเอง ข้อดีอีกประการหนึ่งคือตัววนซ้ำมีวิธีการของตนเอง ซึ่งมีประโยชน์ในการแก้ปัญหาทั่วไปหลายประการและรวมอยู่ในที่เดียว ดูตัวอย่างการใช้ FilesystemIterator กับ readdir() ทั้งสองวิธีใช้การวนซ้ำ แต่ด้วย readdir() คุณจะประมวลผลเฉพาะสตริงเท่านั้น ในขณะที่ FilesystemIterator ทำงานกับอ็อบเจ็กต์ที่สามารถมีข้อมูลเพิ่มเติมเกี่ยวกับไฟล์หรือไดเร็กทอรี (ขนาด เจ้าของ สิทธิ์ และอื่นๆ)

แน่นอนว่า PHP มอบความสามารถในการรับข้อมูลดังกล่าวโดยใช้ฟังก์ชันต่างๆ เช่น ขนาดไฟล์() และ เจ้าของไฟล์() แต่ PHP5 นั้นใช้แนวคิด OOP ดังนั้นจึงเป็นการดีกว่าถ้าใช้วิธีการสมัยใหม่ในการทำงานกับภาษาการเขียนโปรแกรม มีบทเรียนเกี่ยวกับการทำงานกับตัววนซ้ำบนเว็บไซต์ของเรา

ตามที่ได้รายงานไปแล้วในส่วนที่เป็นน้ำของบทช่วยสอน เราจะดูที่การใช้ FilesystemIterator, RecursiveDirectoryIterator และ GlobIterator อันแรกสืบทอดมาจาก DirectoryIterator และส่วนที่เหลือจาก FilesystemIterator พวกมันทั้งหมดมี Constructor เหมือนกัน ซึ่งใช้พารามิเตอร์สองตัว:

  • $path (จำเป็น): พาธไปยังรายการระบบไฟล์ที่ดำเนินการ
  • $flags (เป็นทางเลือก): แฟล็กอย่างน้อยหนึ่งรายการที่อยู่ในเอกสารประกอบ

ความแตกต่างที่แท้จริงของตัววนซ้ำเหล่านี้คือวิธีการใช้เพื่อนำทางเส้นทางที่กำหนด

ระบบไฟล์Iterator

การใช้ FilesystemIterator นั้นง่ายมาก มาดูกันในการดำเนินการ เรานำเสนอสองตัวอย่าง ส่วนแรกจะแสดงการค้นหาไฟล์และไดเร็กทอรีทั้งหมดที่ชื่อขึ้นต้นด้วย "te" ตัวอย่างที่สองใช้ RegexIterator อื่นเพื่อค้นหาไฟล์และไดเร็กทอรีทั้งหมดที่มีชื่อลงท้ายด้วย "t.dat" หรือ "t.php" RegexIterator ใช้เพื่อกรองผลลัพธ์ตามนิพจน์ทั่วไป

getFilename(), "te") === 0) ( $filelist = $entry->getFilename(); ) )

โค้ดด้านบนจะให้ผลลัพธ์ที่คล้ายกับตัวอย่างก่อนหน้านี้

ตัวอย่างที่สองโดยใช้ RegexIterator:

getFilename(); -

มันจะส่งออก:

อาร์เรย์ (0 => "script.php", 1 => "test.dat")

Recursive DirectoryIterator

RecursiveDirectoryIterator จัดเตรียมอินเทอร์เฟซสำหรับการสำรวจไดเรกทอรีระบบไฟล์แบบวนซ้ำ มีวิธีการที่มีประโยชน์หลายวิธี เช่น getChildren() และ hasChildren() ซึ่งจะส่งคืนตัววนซ้ำสำหรับตำแหน่งปัจจุบันหากเป็นไดเร็กทอรี และตรวจสอบว่าจุดเข้าปัจจุบันเป็นไดเร็กทอรีหรือไม่ ตัวอย่างต่อไปนี้สาธิตการใช้ RecursiveDirectoryIterator และ getChildren() ผลลัพธ์จะเหมือนกับในตัวอย่างก่อนหน้า

getChildren(), "/t\.(php|dat)$/"); $filelist = array(); foreach($filter as $entry) ( $filelist = $entry->getFilename(); )

GlobIterator

GlobIterator วนซ้ำผ่านระบบไฟล์ในลักษณะเดียวกับฟังก์ชัน glob() พารามิเตอร์แรกอาจมีรูปแบบสำหรับชื่อ ตัวอย่างนี้แสดงให้เห็นถึงการใช้ GlobIterator โดยให้ผลลัพธ์เหมือนเดิม

getFilename(); -

บทสรุป

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

  • ฟังก์ชัน glob() เป็นโซลูชันในตัว แต่ไม่ยืดหยุ่นเพียงพอ
  • โซลูชันที่ใช้ opendir() , readdir() และ closeir() นั้นซับซ้อนกว่าและต้องการการกรองเพิ่มเติม แต่มีความยืดหยุ่นมากกว่า
  • ฟังก์ชัน scandir() จำเป็นต้องมีการกรองเพิ่มเติม แต่ทำงานได้โดยไม่ต้องประมวลผลจุดจับ
  • หากคุณใช้วิธี OOP คุณควรใช้ไลบรารี SPL นอกจากนี้ คุณยังสามารถขยายชั้นเรียนด้วยฟังก์ชันการทำงานของคุณเองได้
  • GlobIterator มีคุณสมบัติการกรองล่วงหน้า ในขณะที่บางตัวใช้ RegexIterator