วิธีตรวจสอบว่ามีไฟล์ php อยู่หรือไม่ ตรวจสอบการมีอยู่ของไฟล์ใน PHP การใช้ฟังก์ชันในทางปฏิบัติ
พารามิเตอร์ที่จำเป็นสำหรับฟังก์ชันนี้คือชื่อพาธ ซึ่งระบุเส้นทางไปยังไดเร็กทอรีที่จะสร้าง
เอ็มเคดิร์( "โฟลเดอร์ใหม่" );
หากคุณระบุโฟลเดอร์ด้วยวิธีนี้ โฟลเดอร์นั้นจะถูกสร้างขึ้นในไดเร็กทอรีเดียวกันกับที่สคริปต์ PHP ถูกเรียกใช้ หากคุณต้องการสร้างไดเร็กทอรีในตำแหน่งอื่น คุณสามารถระบุพาธสัมพันธ์ไปยังโฟลเดอร์ที่กำลังสร้าง หรือระบุพาธแบบเต็มจากไดเร็กทอรีรากของไซต์ได้
เอ็มเคดิร์( "../โฟลเดอร์ใหม่" ); // ลงไปหนึ่งระดับ
mkdir("/folder1/folder2/newfolder" ); //เส้นทางเต็ม
ในตัวอย่างสุดท้าย สิ่งที่จำเป็นต้องมีคือการมีไดเร็กทอรีย่อย "folder1" และ "folder2" หากไม่มีอยู่ ฟังก์ชันในแบบฟอร์มนี้จะไม่สามารถสร้างโฟลเดอร์ได้และจะส่งคืนข้อผิดพลาด:
คำเตือน: mkdir() : ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าวใน ...
หากสำเร็จ ฟังก์ชันจะส่งกลับ True หากไม่ได้สร้างแพ็ก จะส่งกลับค่าเท็จ
ถ้า (mkdir("โฟลเดอร์ใหม่"))
เสียงสะท้อน "สร้างโฟลเดอร์สำเร็จแล้ว";
อื่น
เสียงสะท้อน "ไม่ได้สร้างโฟลเดอร์";
แต่คุณไม่ควรใช้ฟังก์ชันนี้โดยไม่ตรวจสอบว่ามีโฟลเดอร์อยู่หรือไม่ เนื่องจากเซิร์ฟเวอร์จะยังคงแสดงข้อผิดพลาดว่าไม่สามารถสร้างโฟลเดอร์ได้
การกำหนดสิทธิ์เมื่อสร้างโฟลเดอร์
พารามิเตอร์ทางเลือกตัวที่สองของฟังก์ชัน mkdir มีหน้าที่รับผิดชอบในการกำหนดสิทธิ์ให้กับโฟลเดอร์ที่สร้างขึ้น ตามค่าเริ่มต้น สิทธิ์สูงสุดจะถูกกำหนด – 0777
สิทธิ์ถูกกำหนดโดยใช้ค่าฐานแปดโดยมีศูนย์นำหน้าบังคับ นอกเหนือจากศูนย์ตัวแรกแล้ว ตัวเลขยังแสดงถึงระดับการเข้าถึงสำหรับเจ้าของ สำหรับกลุ่มของเจ้าของ และสำหรับคนอื่นๆ ทั้งหมด
0 – การเข้าถึงถูกปฏิเสธ;
1 – การเข้าถึงเพื่ออ่าน;
2 – การเข้าถึงการเขียน;
4 – การเข้าถึงการดำเนินการ
ส่วนใหญ่แล้ว สิทธิ์จะถูกระบุเป็นจำนวนรวม เช่น:
7 – การเข้าถึงแบบเต็ม (1+2+4);
5 – การอ่านและการดำเนินการ (1+4)
เอ็มเคดิร์( "โฟลเดอร์ใหม่" , 0777); // เข้าถึงได้อย่างเต็มที่สำหรับทุกคน
การสร้างไดเร็กทอรีย่อยที่ซ้อนกันหลายรายการ
คุณสามารถสร้างโฟลเดอร์ย่อยได้หลายโฟลเดอร์พร้อมกันโดยเพียงระบุพารามิเตอร์บูลีนเสริมอื่น – แบบเรียกซ้ำ
mkdir("folder1/folder2/newfolder" , 0777, จริง ); // เข้าถึงได้อย่างเต็มที่สำหรับทุกคน
ในกรณีนี้ หากไม่มีโฟลเดอร์ "folder1" และ "folder2" ฟังก์ชันจะสร้างทั้งโฟลเดอร์เหล่านั้นและโฟลเดอร์ "newfolder" หากไม่มีปัญหาอื่นๆ เกิดขึ้น จะไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้น และฟังก์ชันจะส่งกลับค่า True
กำลังลบโฟลเดอร์
โฟลเดอร์ว่างใน PHP สามารถลบได้โดยใช้ฟังก์ชัน rmdir พารามิเตอร์ dirname ยังระบุพาธแบบเต็มหรือพาธสัมพันธ์ไปยังไดเร็กทอรีที่ต้องการลบ:
rmdir( "โฟลเดอร์ของฉัน" );
rmdir("folder1/folder2/myfolder" );
ในแต่ละกรณี เฉพาะโฟลเดอร์ "myfolder" เท่านั้นที่ถูกลบ หากไม่มีโฟลเดอร์หรือระบุเส้นทางไม่ถูกต้อง ข้อผิดพลาดจะปรากฏขึ้น:
คำเตือน: rmdir(myfolder) : ไม่มีไฟล์หรือไดเร็กทอรีดังกล่าวใน ...
การลบโฟลเดอร์ที่ไม่ว่างเปล่า
การลบไดเร็กทอรีที่ไม่ว่างเปล่าทำได้โดยการลบไฟล์ย่อยในโฟลเดอร์ด้วยฟังก์ชัน unlink ตามลำดับ จากนั้นจึงลบโฟลเดอร์ว่างด้วยฟังก์ชัน rmdir คุณสามารถใช้ฟังก์ชันเช่นนี้เพื่อทำสิ่งนี้:
ฟังก์ชั่น my_delete_dir($mypath)(
$dir = opendir($mypath);
ในขณะที่ (($file = readdir($dir)))(
ถ้า (is_file($mypath."/" .$file))
ยกเลิกการเชื่อมโยง($mypath. "/" .$ไฟล์);
elseif (is_dir($mypath"/" .$file) && ($file != "." ) && ($file != ".." ))
my_delete_dir($mypath"/" .$file);
}
ปิด($dir);
rmdir($mypath);
}
my_delete_dir("โฟลเดอร์ของฉัน" ); // การเรียกใช้ฟังก์ชัน
การตรวจสอบการมีอยู่ของไดเร็กทอรี
ก่อนที่จะดำเนินการกับไดเร็กทอรีส่วนใหญ่ ควรตรวจสอบว่ามีอยู่หรือไม่ ฟังก์ชัน file_exists ใช้สำหรับสิ่งนี้
นอกจากนี้ คุณต้องตรวจสอบให้แน่ใจว่าวัตถุที่ระบุนั้นเป็นโฟลเดอร์ ไม่ใช่ไฟล์ - ฟังก์ชัน is_dir โฟลเดอร์ที่จะสแกนจะถูกระบุโดยเส้นทางแบบสัมพันธ์หรือแบบเต็ม
ถ้า (file_exists("myfolder"))
เสียงสะท้อน "มีโฟลเดอร์ที่ระบุอยู่";
อื่น
เสียงสะท้อน "ไม่มีโฟลเดอร์ที่ระบุ";
ถ้า (is_dir("myfolder"))
เสียงสะท้อน "วัตถุโฟลเดอร์ที่ระบุ";
อื่น
เสียงสะท้อน "วัตถุที่ระบุไม่ใช่โฟลเดอร์";
การใช้ฐานข้อมูลอย่างแพร่หลายไม่ได้ทำให้ระบบไฟล์ทั่วไปไม่เกี่ยวข้อง การเขียนและการอ่านไฟล์ยังคงเป็นส่วนสำคัญในการเขียนโปรแกรม
อัลกอริทึมในการตรวจสอบการมีอยู่ของไฟล์ช่วยให้คุณหลีกเลี่ยงข้อผิดพลาดเมื่อรันโค้ด ฟังก์ชัน PHP file_exists นำเสนอวิธีแก้ปัญหาง่ายๆ สำหรับการตรวจสอบการมีอยู่ของไฟล์หรือไดเร็กทอรี
ไวยากรณ์และการใช้ฟังก์ชัน file_exists
ผลลัพธ์ของฟังก์ชันเป็นจริงหรือเท็จ พารามิเตอร์เดียวคือชื่อไฟล์และเส้นทางไปยังไฟล์นั้น ผลลัพธ์ของฟังก์ชันถูกแคชไว้ เนื่องจากหาก PHP file_exists ไม่ทำงาน แต่มีไฟล์อยู่จริง แสดงว่านี่เป็นข้อผิดพลาดของอัลกอริทึม
ด้วยการใช้ฟังก์ชัน clearstatcache() คุณสามารถหลีกเลี่ยงข้อผิดพลาดมากมายในการตรวจสอบสถานะของระบบไฟล์ที่สามารถเข้าถึงได้ แต่โปรดทราบว่าในไฟล์ที่ไม่มีอยู่ PHP file_exists จะส่งคืนค่า false จนกว่าไฟล์ที่คุณกำลังมองหาจะถูกสร้างขึ้น จากนั้นจะส่งคืนค่าจริงแม้ว่าจะถูกลบไปแล้วก็ตาม
การผสมผสานที่ถูกต้องของฟังก์ชัน clearstatcache() และฟังก์ชันที่เกี่ยวข้องกับระบบไฟล์ (เช่น is_writable(), is_readable(), is_executable(), is_file(), is_dir() และอื่นๆ ช่วยให้คุณหลีกเลี่ยงการเรียกใช้สคริปต์ที่ "ซ่อนไว้" ข้อผิดพลาด
การแคชช่วยปรับปรุงประสิทธิภาพของระบบได้อย่างมาก แต่ในบางกรณีก็สามารถสร้างผลลัพธ์ที่ไม่น่าเชื่อถืออย่างแท้จริงในไฟล์สำคัญ และทำให้เกิดข้อผิดพลาดรันไทม์ที่ร้ายแรงและยากต่อการตรวจจับ
พารามิเตอร์ฟังก์ชัน PHP file_exists
PHP สามารถติดตั้งได้บนแพลตฟอร์มคอมพิวเตอร์ที่แตกต่างกัน ดังนั้นพาธและชื่อไฟล์จึงอาจแตกต่างกัน
เอกสารระบุว่าการตรวจสอบ PHP ตาม UID/GID แทนที่จะเป็นตัวระบุที่มีประสิทธิภาพ การพัฒนาอัลกอริทึม โดยใช้ PHP file_exists คุณควรใส่ใจไม่เพียง แต่เครื่องหมายทับที่ถูกต้อง (ไปข้างหน้าหรือข้างหลัง) การเข้ารหัสเส้นทางไปยังไฟล์และชื่อของไฟล์เท่านั้น แต่ยังตรวจสอบการมีอยู่ของการลงทะเบียนที่จำเป็น อักขระที่ถูกต้อง สิทธิ์การเข้าถึง และสถานการณ์อื่นๆ
ผลลัพธ์เชิงลบอาจได้รับผลกระทบจากการเข้ารหัสไฟล์สคริปต์ และอาจจำเป็นต้องแปลงสตริงอักขระที่ดึงมาจากฐานข้อมูล
การใช้ฟังก์ชันในทางปฏิบัติ
การใช้งาน สคริปต์ PHPแตกต่างกันอย่างมีนัยสำคัญ นี่ไม่ได้หมายความว่า PHP file_exists ใช้เพื่อจัดเก็บข้อมูลระบบ ไฟล์ข้อมูล วัตถุ หรือรูปภาพที่สร้างขึ้นแบบไดนามิกเท่านั้น
มีกรณีที่พบบ่อยในการใช้การสตรีมข้อมูลชั่วคราวปริมาณมากที่ไม่ได้ถูกวางลงในฐานข้อมูลอย่างมีประสิทธิภาพในทันที ข้อมูลจากผู้เยี่ยมชมหลายรายสามารถไหลไปยังไซต์ได้ และหลังจากการประมวลผลเบื้องต้นในช่วงระยะเวลาหนึ่งเท่านั้น ข้อมูลที่จำเป็นจะต้องวางไว้ในตารางฐานข้อมูล
การอ่าน ไฟล์ระบบอาจทำให้เกิดแคชเนื่องจากการรีเฟรชหลายหน้าหรือการกระทำของผู้เยี่ยมชมที่ไม่ถูกต้อง ในความเป็นจริงมีสถานการณ์ค่อนข้างมาก แต่เมื่อใช้อย่างถูกต้อง ฟังก์ชันนี้จะช่วยให้คุณสามารถเขียนโค้ดที่ปลอดภัยและเชื่อถือได้
มีบางครั้งที่คุณต้องตรวจสอบว่ามีไฟล์ที่ระบุอยู่หรือไม่ เช่น เพื่อดำเนินการบางอย่างกับไฟล์ในภายหลัง
ฉันยังพบปัญหานี้เมื่อพัฒนาโมดูล และฉันพบสองทางเลือกในการแก้ปัญหา
การตรวจสอบการมีอยู่ของไฟล์โดยใช้ลิงก์ URL
ใน PHP มีฟังก์ชั่น " โฟเพน" ซึ่งสามารถใช้เพื่อเปิด URL ที่ระบุได้
เรากำลังทำอะไรอยู่? เราพยายามเปิดไฟล์ และหากเราทำสำเร็จ ไฟล์นั้นก็จะมีอยู่ มิฉะนั้น ไฟล์นั้นก็จะไม่มีอยู่จริง
การนำไปปฏิบัติ:
แต่จะเกิดอะไรขึ้นถ้าเราไม่มีไฟล์เดียว แต่มีลิงก์หลายชุดล่ะ? นี่เป็นงานที่ยืนอยู่ตรงหน้าฉันตั้งแต่แรกเริ่ม และวิธีการแก้ไขปัญหานี้มีดังนี้:
ในกรณีนี้ เราได้รับรายการเฉพาะไฟล์ที่มีอยู่เท่านั้น
การตรวจสอบการมีอยู่ของไฟล์ในเครื่อง
คำว่า "ท้องถิ่น" หมายความว่าสคริปต์และไฟล์สำหรับการตรวจสอบอยู่บนเซิร์ฟเวอร์เดียวกัน หากคุณมีลิงก์จำนวนมาก ตัวเลือกนี้เหมาะที่สุดสำหรับการแก้ปัญหา เนื่องจากเราไม่ได้ส่งคำขอ เซิร์ฟเวอร์ของบุคคลที่สามแต่กำลังสแกนไดเร็กทอรีที่ระบุ
วิธีการนี้ใช้ฟังก์ชัน "file_exists" และโดยการเปรียบเทียบกับตัวเลือกก่อนหน้า เพียงแทนที่ส่วนหนึ่งของสคริปต์:
และเช่นเดียวกันสำหรับอาร์เรย์ลิงก์:
มันคุ้มค่าอะไร ใส่ใจ- ความจริงที่ว่าวิธีนี้สะดวกสำหรับการเรียกใช้ไฟล์ที่อยู่ในระบบไฟล์ของเรา ดังนั้นจึงแนะนำให้ระบุลิงก์ทั้งหมดเป็นลิงก์ที่เกี่ยวข้อง
อย่างไรก็ตาม เมื่อทำการสั่งซื้อรายการใดรายการหนึ่ง ด้วยวิธีนี้ฉันสามารถสแกนไฟล์ได้ประมาณ 135,000 ไฟล์ในเวลาเพียงไม่กี่วินาที
มีบางครั้งที่คุณต้องตรวจสอบว่ามีไฟล์ที่ระบุอยู่หรือไม่ เช่น เพื่อดำเนินการบางอย่างกับไฟล์ในภายหลัง
ฉันยังพบปัญหานี้เมื่อพัฒนาโมดูล และฉันพบสองทางเลือกในการแก้ปัญหา
การตรวจสอบการมีอยู่ของไฟล์โดยใช้ลิงก์ URL
ใน PHP มีฟังก์ชั่น " โฟเพน" ซึ่งสามารถใช้เพื่อเปิด URL ที่ระบุได้
เรากำลังทำอะไรอยู่? เราพยายามเปิดไฟล์ และหากเราทำสำเร็จ ไฟล์นั้นก็จะมีอยู่ มิฉะนั้น ไฟล์นั้นก็จะไม่มีอยู่จริง
การนำไปปฏิบัติ:
แต่จะเกิดอะไรขึ้นถ้าเราไม่มีไฟล์เดียว แต่มีลิงก์หลายชุดล่ะ? นี่เป็นงานที่ยืนอยู่ตรงหน้าฉันตั้งแต่แรกเริ่ม และวิธีการแก้ไขปัญหานี้มีดังนี้:
ในกรณีนี้ เราได้รับรายการเฉพาะไฟล์ที่มีอยู่เท่านั้น
การตรวจสอบการมีอยู่ของไฟล์ในเครื่อง
คำว่า "ท้องถิ่น" หมายความว่าสคริปต์และไฟล์สำหรับการตรวจสอบอยู่บนเซิร์ฟเวอร์เดียวกัน หากคุณมีลิงก์จำนวนมาก ตัวเลือกนี้เหมาะที่สุดสำหรับการแก้ปัญหา เนื่องจากเราไม่ได้ส่งคำขอไปยังเซิร์ฟเวอร์บุคคลที่สาม แต่กำลังสแกนไดเรกทอรีที่ระบุ
วิธีการนี้ใช้ฟังก์ชัน "file_exists" และโดยการเปรียบเทียบกับตัวเลือกก่อนหน้า เพียงแทนที่ส่วนหนึ่งของสคริปต์:
และเช่นเดียวกันสำหรับอาร์เรย์ลิงก์:
มันคุ้มค่าอะไร ใส่ใจ- ความจริงที่ว่าวิธีนี้สะดวกสำหรับการเรียกใช้ไฟล์ที่อยู่ในระบบไฟล์ของเรา ดังนั้นจึงแนะนำให้ระบุลิงก์ทั้งหมดเป็นลิงก์ที่เกี่ยวข้อง
อย่างไรก็ตาม เมื่อทำการสั่งซื้อรายการใดรายการหนึ่ง ด้วยวิธีนี้ฉันสามารถสแกนไฟล์ได้ประมาณ 135,000 ไฟล์ในเวลาเพียงไม่กี่วินาที
คำอธิบาย:
bool file_exists (สตริง $filename)
ตรวจสอบความพร้อม ไฟล์ที่ระบุหรือแคตตาล็อก
รายการพารามิเตอร์:
พาธไปยังไฟล์หรือไดเร็กทอรี
บนแพลตฟอร์ม Windows เพื่อตรวจสอบไฟล์ ทรัพยากรเครือข่ายให้ใช้ชื่อเช่น //ชื่อคอมพิวเตอร์/share/ชื่อไฟล์ หรือ \\ชื่อคอมพิวเตอร์\share\ชื่อไฟล์.
ส่งกลับค่า:
การส่งคืน จริงหากไฟล์หรือไดเร็กทอรีที่ระบุด้วยชื่อไฟล์มีอยู่ มิฉะนั้นจะส่งคืน เท็จ.
ความคิดเห็น:
ฟังก์ชันนี้ส่งคืน ฟอลส์ E ใช้สำหรับลิงก์สัญลักษณ์ที่ชี้ไปยังไฟล์ที่ไม่มีอยู่จริง
ความสนใจ!
หากไฟล์ไม่สามารถใช้งานได้เนื่องจากข้อจำกัดที่กำหนดโดย เซฟโหมด, ที่ ฟังก์ชั่นนี้จะกลับมา เท็จ- อย่างไรก็ตาม ไฟล์เหล่านี้ยังคงสามารถรวมได้หากอยู่ในไดเร็กทอรี safe_mode_include_dir
ความคิดเห็น:
ความคิดเห็น:
เนื่องจากประเภทจำนวนเต็มใน PHP เป็นจำนวนเต็มที่มีเครื่องหมาย และหลายแพลตฟอร์มใช้จำนวนเต็ม 32 บิต ฟังก์ชันระบบไฟล์บางฟังก์ชันอาจส่งคืนผลลัพธ์ที่ไม่คาดคิดสำหรับไฟล์ที่มีขนาดใหญ่กว่า 2GB
ตัวอย่าง:
ตัวอย่าง #1การตรวจสอบการมีอยู่ของไฟล์:
$filename = '/path/to/foo.txt'; if (file_exists($filename)) ( echo "ไฟล์ $filename มีอยู่"; ) else ( echo "ไฟล์ $filename ไม่มีอยู่"; )
file_exists
( PHP 3, PHP 4, PHP 5)
file_exists— ตรวจสอบการมีอยู่ของไฟล์หรือไดเร็กทอรีที่ระบุ
คำอธิบาย
บูล file_exists(ชื่อไฟล์สตริง)
ส่งคืนหากไฟล์หรือไดเร็กทอรีที่มีชื่อที่ระบุในพารามิเตอร์ชื่อไฟล์มีอยู่ กลับเป็นอย่างอื่น
บนแพลตฟอร์ม Windows หากต้องการตรวจสอบไฟล์ในการแชร์เครือข่าย ให้ใช้ชื่อเช่น หรือ
ตัวอย่างที่ 1: การตรวจสอบว่ามีไฟล์อยู่หรือไม่
ความคิดเห็น:ผลลัพธ์ของฟังก์ชันนี้ถูกแคชไว้ มากกว่า ข้อมูลรายละเอียดดูหัวข้อ ล้างสแตทแคช().
เบาะแส:ตั้งแต่ PHP 5.0.0 คุณลักษณะนี้สามารถใช้กับ url packer บางตัวได้ รายการ Wrapper ที่ตระกูลฟีเจอร์รองรับ สถิติ()โปรดดูภาคผนวก ม.
ดูคำอธิบายฟังก์ชันด้วย is_readable(), is_เขียนได้(), is_file()และ ไฟล์().
ดูเพิ่มเติมที่:
ไฟล์ฟังก์ชั่นทั้งหมด
คำอธิบายบน ru2.php.net
คำอธิบายบน php.ru
คุณต้องมีชื่อไฟล์ในเครื่องหมายคำพูดอย่างน้อยที่สุด (เป็นสตริง):
นอกจากนี้ตรวจสอบให้แน่ใจว่ามีการตรวจสอบอย่างถูกต้อง จากนั้นจะใช้งานได้เมื่อเปิดใช้งานในการกำหนดค่า PHP ของคุณเท่านั้น
ลองสิ่งนี้:
ตอนแรก คุณต้องการเข้าใจ: มี คุณไม่มีไฟล์ .
ไฟล์เป็นวัตถุ ระบบไฟล์แต่คุณกำลังส่งคำขอโดยใช้โปรโตคอล HTTP ซึ่งไม่รองรับไฟล์อื่นที่ไม่ใช่ URL
ดังนั้นคุณควรขอไฟล์ที่ไม่ได้ใช้โดยใช้เบราว์เซอร์ของคุณและดูโค้ดตอบกลับ
PHP ตรวจสอบการมีอยู่/มีอยู่ของไฟล์ระยะไกล
หากไม่ใช่ 404 คุณจะไม่สามารถใช้ wrappers ใด ๆ เพื่อดูว่ามีไฟล์อยู่หรือไม่และคุณต้องค้นหา cdn ของคุณโดยใช้โปรโตคอลอื่นเช่น FTP
ที่นี่ วิธีที่ง่ายที่สุดตรวจสอบว่ามีไฟล์อยู่หรือไม่:
มีความแตกต่างใหญ่ระหว่างและ
php.net/manual/en/function.is-file.php ส่งคืน true สำหรับไฟล์ (ปกติ):
การส่งคืน จริง,หากชื่อไฟล์มีอยู่และเป็นไฟล์ปกติ มิฉะนั้น เท็จ .
คืนค่าจริงสำหรับทั้งไฟล์และไดเร็กทอรี:
การส่งคืน จริง,หากมีไฟล์หรือไดเร็กทอรีที่ระบุด้วยชื่อไฟล์ เท็จในมิฉะนั้น.
บันทึก.สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหานี้ โปรดตรวจสอบคำถามนี้โดยใช้
คุณสามารถใช้ cURL คุณอาจได้รับ cURL เพียงเพื่อให้ส่วนหัวไม่ใช่เนื้อหา ซึ่งอาจทำให้เร็วขึ้น โดเมนที่ไม่ถูกต้องอาจใช้เวลาสักครู่เสมอ เนื่องจากคุณจะต้องรอให้คำขอหมดเวลา คุณอาจเปลี่ยนระยะเวลาหมดเวลาได้โดยใช้ cURL
นี่คือตัวอย่าง:
ลองสิ่งนี้:
อ่านไม่เพียงแต่ไฟล์เท่านั้น แต่ยังรวมถึงเส้นทางด้วย ดังนั้นเมื่อว่างเปล่า คำสั่งจะทำงานเหมือนกับว่าเขียนไว้ดังนี้:
หากมีไดเร็กทอรี /images/ ฟังก์ชันจะยังคงส่งคืน
ฉันมักจะเขียนแบบนี้:
หากคุณใช้ curl คุณสามารถลองใช้สคริปต์ต่อไปนี้:
ส่งกลับค่า
ส่งคืนหากไฟล์หรือไดเร็กทอรีที่ระบุโดยพารามิเตอร์มีอยู่ มิฉะนั้นจะส่งคืน
ความคิดเห็น:
ฟังก์ชันนี้ส่งคืนลิงก์สัญลักษณ์ที่ชี้ไปยังไฟล์ที่ไม่มีอยู่จริง
จะตรวจสอบได้อย่างไรว่ามีไดเร็กทอรีอยู่ใน PHP และลบออกได้อย่างไร?
ความคิดเห็น:
การตรวจสอบความถูกต้องเกิดขึ้นโดยใช้ UID/GID จริง แทนที่จะเป็นตัวระบุที่มีประสิทธิภาพ
ความคิดเห็น: เนื่องจากประเภทจำนวนเต็มใน PHP เป็นจำนวนเต็มที่มีเครื่องหมายและหลายแพลตฟอร์มใช้จำนวนเต็ม 32 บิต ฟังก์ชันระบบไฟล์บางฟังก์ชันอาจส่งคืนผลลัพธ์ที่ไม่คาดคิดสำหรับไฟล์ที่มีขนาดใหญ่กว่า 2GB
ตัวอย่าง
ตัวอย่างที่ 1 การตรวจสอบว่ามีไฟล์อยู่หรือไม่
ข้อผิดพลาด
หากการดำเนินการล้มเหลว จะเกิดข้อผิดพลาดระดับขึ้น
- is_readable() — กำหนดว่าไฟล์นั้นมีอยู่และสามารถอ่านได้หรือไม่
- is_writable() - กำหนดว่าไฟล์สามารถเขียนได้หรือไม่
- is_file() — กำหนดว่าไฟล์นั้นเป็นไฟล์ปกติหรือไม่
- file() — อ่านเนื้อหาของไฟล์และวางลงในอาร์เรย์
กลับไปที่: ระบบไฟล์
การตรวจสอบการดำรงอยู่
PHP มีสองวิธีในการตรวจสอบว่ามีไดเร็กทอรีอยู่หรือไม่ อย่างแรกคือการใช้ฟังก์ชัน file_exists() หลักการทำงานของมันถูกกล่าวถึงก่อนหน้านี้ในบทความเกี่ยวกับสิทธิ์การเข้าถึง โปรดจำไว้ว่าฟังก์ชันรับพารามิเตอร์สตริงเพียงตัวเดียวเท่านั้น - เส้นทางไป ระบบไฟล์- แม้ว่าชื่อจะมีคำว่า "ไฟล์" แต่ก็ใช้งานได้ดีกับไดเร็กทอรี
วิธีที่สองเกี่ยวข้องกับฟังก์ชัน is_dir() ในตัว เช่นเดียวกับ file_exists() ยอมรับเส้นทางไดเร็กทอรีแบบสัมพัทธ์หรือแบบสัมบูรณ์ อย่างไรก็ตาม นอกเหนือจากการตรวจสอบการมีอยู่แล้ว ยังจะยืนยันข้อเท็จจริงด้วยว่าเป็นไดเรกทอรี ไม่ใช่ไฟล์ที่อยู่บนเส้นทางนี้ หากสตริงอธิบายตำแหน่งของลิงก์แบบฮาร์ดหรือสัญลักษณ์ is_dir() จะนำทางไปยังลิงก์นั้นและแยกวิเคราะห์จุดสิ้นสุดของเส้นทาง หากสำเร็จ ระบบจะส่งกลับค่าบูลีนจริง และหากไม่สำเร็จจะส่งกลับค่าเท็จ
//สร้างไดเร็กทอรีใหม่ในรูทของไซต์เพื่อตรวจสอบ $dirName = “($_SERVER['DOCUMENT_ROOT'])/directory”; if (!file_exists($dirName)) ( mkdir($dirName); ) var_dump(file_exists($dirName)); //ผลลัพธ์: bool(true) var_dump(is_dir($dirName)); //ผลลัพธ์: บูล(จริง)
บันทึก
ฟังก์ชั่นที่รับผิดชอบในการตรวจสอบไดเร็กทอรีที่มีอยู่อาจส่งคืนค่าเท็จหากไม่มีสิทธิ์ในการเข้าถึง สิ่งเหล่านี้ไม่ได้ขึ้นอยู่กับสคริปต์ PHP นี่คือระดับความรับผิดชอบของระบบปฏิบัติการ
การลบไดเร็กทอรี
หากต้องการลบไดเร็กทอรีใน PHP ให้ใช้ฟังก์ชัน rmdir() เนื่องจากเป็นพารามิเตอร์แรก จะต้องผ่านตำแหน่งของไดเร็กทอรี เช่นเดียวกับตัวอย่างข้างต้น ค่าบูลีนจริงหรือเท็จจะถูกส่งกลับ
การลบไดเร็กทอรีอาจดูเหมือนเป็นเรื่องง่าย อย่างไรก็ตาม ในกรณีส่วนใหญ่จะไม่เป็นเช่นนั้น ฟังก์ชัน rmdir() ใช้งานได้กับไดเร็กทอรีว่างเท่านั้น และส่งกลับค่าเท็จหากมีอย่างอื่นอยู่ ในกรณีนี้ คุณต้องใช้การลบแบบเรียกซ้ำ
//สร้างไดเรกทอรีชั่วคราวสำหรับการสาธิต $dirName = “($_SERVER['DOCUMENT_ROOT'])/directory”; if (!file_exists($dirName)) ( mkdir($dirName); ) if (rmdir($dirName)) ( echo 'ไดเร็กทอรีถูกลบเรียบร้อยแล้ว'; ) else ( echo 'ไม่สามารถลบไดเร็กทอรีได้'; )
การลบแบบเรียกซ้ำ
ไม่มีวิธีที่ง่ายในการลบไดเร็กทอรีทั้งหมด
ด้านล่างนี้เราให้สองตัวอย่างของการนำกลไกดังกล่าวไปใช้ สามารถบันทึกเป็นฟังก์ชันและนำไปใช้ได้ทุกที่ในโค้ด
วิธีแรกในการลบไดเร็กทอรีใน PHP คือการใช้ฟังก์ชันแบบเรียกซ้ำ นั่นคือฟังก์ชันที่เรียกตัวเองตราบใดที่ตรงตามเงื่อนไขบางประการ ลองดูตัวอย่างด้านล่าง มันค่อนข้างง่ายที่จะเข้าใจ
ตรวจสอบการมีอยู่ของไฟล์ใน php.ini
เราใช้ ฟังก์ชั่นมาตรฐาน scandir() เพื่อวนซ้ำเนื้อหาทั้งหมดของไดเร็กทอรี หากเราเจอไฟล์ เราจะเรียกใช้ฟังก์ชัน unlink() และหากพบไดเร็กทอรีอื่น เราจะใช้ชื่อไฟล์นั้นเพื่อทำการเรียกซ้ำ
//ตัวอย่างของฟังก์ชันสำหรับการลบไดเร็กทอรีที่กำหนดแบบวนซ้ำ ฟังก์ชัน DeleteDirectory($directoryName) ( $files = array_diff(scandir($directoryName), ['.', '..']); foreach ($files as $file) ( if (is_dir (“$directoryName/$file”)) ( DeleteDirectory(“$directoryName/$file”); ) else ( unlink(“$directoryName/$file”); ) ) return rmdir($directoryName);
PHP ยังมีคลาส RecursiveDirectoryIterator และ RecursiveIteratorIterator ในตัวอีกสองคลาส สามารถใช้เพื่อวนซ้ำระดับการซ้อนทั้งหมดของไดเร็กทอรีที่ระบุ โปรดทราบว่าเมื่อสร้างอินสแตนซ์ของคลาส RecursiveIteratorIterator เราจะใช้พารามิเตอร์ตัวที่สอง RecursiveIteratorIterator::CHILD_FIRST มันบังคับให้ไฟล์และไดเร็กทอรีทั้งหมดวนซ้ำโดยเริ่มจากไฟล์ที่ซ้อนกันมากที่สุด ด้วยวิธีนี้ คุณสามารถทำได้โดยไม่ต้องเรียกใช้ฟังก์ชันเรียกซ้ำอย่างชัดเจน
//ตัวอย่างฟังก์ชันที่ไม่ใช้ฟังก์ชันการเรียกแบบเรียกซ้ำ DeleteDirectory($directoryName) ( $iterator = new RecursiveDirectoryIterator($directoryName); $files = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST); foreach ($files as $file) ( if (in_array($file->getFilename(), ['..', '.'])) ( Continue; ) ($file->isDir()) ? rmdir($file) : unlink( $ไฟล์); rmdir($ชื่อไดเรกทอรี);