بيت / وحدات تحكم اللعبة / Php يحصل على آخر ملف مضاف في المجلدات الفرعية. الحصول على قائمة الملفات والأدلة باستخدام PHP. باستخدام التكرارات SPL

Php يحصل على آخر ملف مضاف في المجلدات الفرعية. الحصول على قائمة الملفات والأدلة باستخدام PHP. باستخدام التكرارات SPL

سنتعامل في هذا الدرس مع مهمة نموذجية تنشأ أثناء العمل على مشروع PHP: الحصول على قائمة بالملفات والأدلة. سنناقش عدة طرق أساسية وأكثر تعقيدًا، مع ذكر إيجابيات وسلبيات كل منها. ستستخدم الحلول الثلاثة الأولى وظائف PHP القياسية، وبعد ذلك سنقدم حلاً أكثر قوة باستخدام مكررات SPL.

لغرض المناقشة الموضوعية للحل والعروض التوضيحية، سنفترض أن بنية الدليل هي كما يلي:

\---المدير | \---المستخدم | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

الحلول الأساسية

تعتمد المجموعة الأولى من الحلول على استخدام الدالة glob()، وهي مزيج من الدالات opendir() وreaddir() وClosedir()، وكذلك الدالة scandir().

باستخدام الكرة الأرضية ()

يعتمد الحل الأول على استخدام الدالة glob()‎، والتي تتيح لك البحث عن المسارات باستخدام الأنماط. تحتوي الدالة على معلمتين:

  • نمط $ (مطلوب): نمط البحث
  • أعلام $ (اختياري): علامة واحدة أو أكثر، يمكن العثور على وصف لها في الوثائق

دعونا نلقي نظرة على الأمثلة. للبحث في دليل عن كافة الملفات والمجلدات التي تنتهي أسماؤها بـ .رسالة قصيرة، يجب عليك استخدام الكود:

إذا قمنا بعرض المتغير $filelist، فسنحصل على:

المصفوفة (0 => "article.txt"، 1 => "text.txt")

إذا كنت بحاجة إلى قائمة بالملفات والأدلة التي تبدأ أسماؤها بـ "te"، فسيبدو الكود كما يلي:

والإخراج يبدو كالتالي:

المصفوفة (0 => "test.dat"، 1 => "text.txt")

وللحصول على قائمة بالأدلة التي تحتوي على "ma" فقط، استخدم الكود:

سينتج المثال الأخير:

صفيف (0 => "مدير")

لاحظ أن المثال الأخير يستخدم علامة GLOB_ONLYDIR كمعلمة ثانية للدالة. ولذلك، يتم استبعاد الملف master.dat من القائمة. على الرغم من أن الدالة glob() سهلة الاستخدام للغاية، إلا أنها في بعض الأحيان لا تكون مرنة بدرجة كافية. على سبيل المثال، لا توجد علامة للحصول على الملفات فقط (بدون أدلة) التي تطابق النمط.

نستخدم opendir() و readdir() و Closedir() .

الطريقة الثانية للحصول على قائمة الملفات والأدلة التي سنناقشها هي استخدام وظائف opendir() و readdir() و Closedir().

تقوم الدالة opendir() بفتح دليل وإرجاع مقبض الاتصال. بمجرد الحصول على المقبض، يمكن استخدام الدالة readdir(). مع كل استدعاء، تقوم هذه الدالة بإرجاع اسم الملف أو الدليل التالي داخل الدليل المفتوح. إذا تم إدراج كافة الأسماء بالفعل، فستعود الدالة خطأ شنيع. يتم استخدام الدالة Closedir() لإغلاق المقبض.

على عكس استخدام الدالة glob()، يعد هذا الأسلوب أكثر تعقيدًا لأنه ليس لديك معلمات للمساعدة في تصفية قائمة أسماء الملفات والدلائل التي تم إرجاعها. يجب عليك القيام بالتصفية بنفسك للحصول على النتائج التي تريدها.

يعرض المثال التالي قائمة بأسماء الملفات والدلائل التي تبدأ بـ "te":

عند تشغيل الكود أعلاه، سيحتوي المتغير $entry على تضمينات مثل "." و "..". هذان دليلان ظاهريان موجودان في كل دليل نظام الملفات. إنهم يمثلون الدليل الحالي والدليل الأصلي على التوالي.

يعرض المثال الثاني الملفات الموجودة في الدليل المحدد فقط.

المثال سينتج ما يلي:

المصفوفة (0 => "article.txt"، 1 => "master.dat"، 2 => "script.php"، 3 => "test.dat"، 4 => "text.txt")

باستخدام سكاندير ()

وأخيرا، دعونا نقدم الدالة scandir(). يحتوي على معلمة واحدة مطلوبة فقط: مسار القراءة. تقوم الدالة بإرجاع مجموعة من الملفات والدلائل الموجودة في المسار المحدد. للحصول على قائمة بالملفات والأدلة بناءً على معيار محدد، يتعين عليك إجراء تصفية إضافية. من ناحية أخرى، الحل أكثر إيجازًا ولا يتطلب إدارة المقبض.

يوضح هذا المثال كيفية الحصول على قائمة بالملفات والأدلة التي تبدأ أسماؤها بـ "te":

دعونا نستخدم مكررات SPL

الآن دعونا نلقي نظرة على استخدام مكررات SPL. ولكن قبل أن نبدأ في حل مشكلتنا، دعونا نقدم مقدمة لمكتبة SPL والمكررات. توفر مكتبة SPL سلسلة من الفئات لهياكل البيانات الموجهة للكائنات والمكررات وواصفات الملفات والمزيد.

إحدى فوائد التكرارات هي أنها فئات ويمكن توسيعها لتناسب احتياجاتك الخاصة. ميزة أخرى هي أن التكرارات لها أساليبها الخاصة، والتي تكون مفيدة لحل العديد من المشكلات الشائعة وتقع في مكان واحد. انظر إلى مثال لاستخدام FilesystemIterator مقابل readdir() . تستخدم كلتا الطريقتين حلقة، لكن باستخدام readdir()‎ يمكنك معالجة سلسلة فقط، بينما يعمل FilesystemIterator مع كائن يمكن أن يحتوي على معلومات إضافية حول الملف أو الدليل (الحجم والمالك والأذونات وما إلى ذلك).

وبطبيعة الحال، PHP يوفر القدرة على الحصول على هذه المعلومات باستخدام وظائف مثل حجم الملف () ومالك الملف (). لكن PHP5 يعتمد على استخدام مفهوم OOP. لذلك فمن الأفضل استخدامها الأساليب الحديثةالعمل مع لغة البرمجة. هناك دروس حول العمل مع التكرارات على موقعنا.

كما ذكرنا سابقًا في الجزء المائي من البرنامج التعليمي، سننظر في استخدام FilesystemIterator وRecursiveDirectoryIterator وGlobIterator. الأول يرث من DirectoryIterator والباقي من FilesystemIterator. لديهم جميعًا نفس المنشئ، والذي يأخذ معلمتين:

  • $path (مطلوب): المسار إلى إدخال نظام الملفات الذي يتم تنفيذ العمليات عليه
  • أعلام $ (اختياري): علامة واحدة أو أكثر مدرجة في الوثائق

الفرق الحقيقي في هذه التكرارات هو كيفية استخدامها للتنقل على طول مسار معين.

FilesystemIterator

يعد استخدام FilesystemIterator أمرًا بسيطًا للغاية. دعونا نرى ذلك في العمل. نقدم مثالين. يعرض الأول بحثًا عن جميع الملفات والأدلة التي تبدأ أسماؤها بـ "te". يستخدم المثال الثاني RegexIterator آخر للعثور على جميع الملفات والأدلة التي تنتهي أسماؤها بـ "t.dat" أو "t.php". يتم استخدام RegexIterator لتصفية النتيجة بناءً على التعبيرات العادية.

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

سوف ينتج عن الكود أعلاه نتيجة مشابهة للأمثلة السابقة.

المثال الثاني باستخدام RegexIterator:

getFilename(); )

سوف يخرج:

المصفوفة (0 => "script.php"، 1 => "test.dat")

RecursiveDirectoryIterator

يوفر RecursiveDirectoryIterator واجهة لاجتياز أدلة نظام الملفات بشكل متكرر. يحتوي على عدة طرق مفيدة، مثل getChildren() و hasChildren()، والتي تقوم بإرجاع مكرر للموقع الحالي إذا كان دليلاً، والتحقق مما إذا كانت نقطة الإدخال الحالية دليلاً. يوضح المثال التالي استخدام RecursiveDirectoryIterator و getChildren() . وستكون النتيجة هي نفسها كما في الأمثلة السابقة.

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

GlobIterator

يقوم GlobIterator بالتكرار عبر نظام الملفات بنفس طريقة عمل الدالة glob(). قد تتضمن المعلمة الأولى نمطًا للاسم. يوضح المثال استخدام GlobIterator بنفس النتيجة السابقة.

getFilename(); )

خاتمة

يوضح هذا الدرس استخدام طرق مختلفة لتحقيق نفس الهدف: الحصول على قائمة بالملفات والأدلة. وينبغي تذكر النقاط الرئيسية التالية:

  • تعد الدالة glob()‎ حلًا مضمنًا، ولكنها ليست مرنة بدرجة كافية.
  • يعد الحل المبني على opendir() و readdir() و Closedir() أكثر تعقيدًا ويتطلب تصفية إضافية، ولكنه أكثر مرونة.
  • تتطلب الدالة scandir() تصفية إضافية، ولكنها تعمل دون معالجة المقبض.
  • إذا كنت تستخدم أسلوب OOP، فيجب عليك استخدام مكتبة SPL. بالإضافة إلى ذلك، يمكنك توسيع الفئات باستخدام وظائفك الخاصة.
  • يحتوي GlobIterator على ميزة التصفية المسبقة، بينما يستخدم الآخرون RegexIterator.

Reg.ru: المجالات والاستضافة

أكبر مزود مسجل واستضافة في روسيا.

أكثر من 2 مليون اسم نطاق في الخدمة.

الترويج، بريد المجال، حلول الأعمال.

لقد قام أكثر من 700 ألف عميل حول العالم باختيارهم بالفعل.

* مرر الماوس فوق لإيقاف التمرير مؤقتًا.

العودة إلى الأمام

الحصول على قائمة المجلدات باستخدام PHP

سرد الدلائل باستخدام PHP، أو سرد الدلائل

سوف نطلق على قائمة الدليل استعلام عام يقوم بإنشاء قائمة بجميع أو بعض الملفات والأدلة الخاصة بالدليل الأصلي - وهي عملية مشابهة لعمل صفحة الفهرس التي توفرها معظم خوادم الويب، ولكن مع ياتحكم أكبر في المحتوى والتنسيق.

ميزة أخرى لهذا البرنامج النصي هي القدرة على تنفيذ إجراءات معينة مع الملفات باستخدام PHP. على أية حال، الخطوة الأولى التي يتعين علينا القيام بها هي الاستعلام عن نظام الملفات - وإرجاع قائمة الملفات والأدلة.

تتيح لك الوظائف المعروضة أدناه استخراج أسماء الملفات والخصائص الأخرى من دليل محدد، أو التكرار عبر الفئات الفرعية بشكل متكرر.

تعليق: PHP5 لديه وظيفة سكاندير، والذي "يقوم بإرجاع قائمة بالملفات والأدلة داخل الدليل في مسار معين"، ولكنه لا يعرض أي معلومات إضافية حول الملفات الموجودة داخل الدليل.

قائمة دليل واحد

في البداية، إليك مثال لوظيفة بسيطة تقوم بإرجاع قائمة بالملفات والأدلة وخصائصها من دليل واحد (ستجد إصدارات أكثر تقدمًا من هذه الوظيفة لاحقًا في هذا الدرس.)

read())) ( // تخطي الملفات المخفية if($entry == ".") continue; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ الإدخال/"، "الحجم" => 0، "lastmod" => filemtime("$dir$entry")); ) elseif(is_readable("$dir$entry")) ( $retval = array("name" = > "$dir$entry", "size" => png("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->إغلاق();

إرجاع $retval؛

) ؟>

يمكنك استخدام هذه الوظيفة كما يلي:

القيمة المرجعة هي مصفوفة ترابطية من الملفات، بما في ذلك معلومات مسار الملف وحجمه وتاريخ التعديل الأخير، ما لم يكن الملف دليلاً، وفي هذه الحالة تظهر السلسلة "(dir)" بدلاً من حجم الملف.مثال 1:

"،print_r($dirlist)،"

القيمة المرجعة هي مصفوفة ترابطية من الملفات، بما في ذلك معلومات مسار الملف وحجمه وتاريخ التعديل الأخير، ما لم يكن الملف دليلاً، وفي هذه الحالة تظهر السلسلة "(dir)" بدلاً من حجم الملف."; /* مثال على مصفوفة الإخراج ( => Array ( => Images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

مثال 2:

"; /* مثال على مصفوفة الإخراج ( => Array ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

قائمة الملفات عبر HTML للحصول على نتائج الإخراج على الصفحة بتنسيق HTML، سنقوم بالتكرار خلال المصفوفة التي تم إرجاعها\n"; صدى "اسميكتبمقاس قائمة الملفات عبر HTML الوضع الأخير.قائمة الملفات عبر HTML \n"; foreach($dirlist as $file) ( echo "قائمة الملفات عبر HTML ((الملف["الاسم"])قائمة الملفات عبر HTML قائمة الملفات عبر HTML((ملف["نوع"])((ملف["الحجم"])

\n"; ) صدى "

  • \n\n"; ?>
  • من السهل تعديل هذا الكود، على سبيل المثال:
  • - عرض نتائج القائمة على شكل قائمة بدلا من الجدول؛
  • - جعل أسماء الملفات روابط نشطة؛

- استبدال الأسماء بالأيقونات بناءً على نوع الملف؛

قائمة الملفات عبر HTML للحصول على نتائج الإخراج على الصفحة بتنسيق HTML، سنقوم بالتكرار خلال المصفوفة التي تم إرجاعها\n"; صدى "اسميكتبإلخ. قائمة الملفات عبر HTML الوضع الأخير.قائمة الملفات عبر HTML \n"; foreach($dirlist as $file) ( echo "قائمة الملفات عبر HTML ((الملف["الاسم"])قائمة الملفات عبر HTML على سبيل المثال، لإخراج ملفات PNG فقط، أضف شرطًا بسيطًا إلى حلقة الإخراج:قائمة الملفات عبر HTML((ملف["نوع"])((ملف["الحجم"])

\n"; foreach($dirlist as $file) ( //تحقق مما إذا كان الملف بتنسيق PNG if(!preg_match("/\.png$/", $file["name"])) continue; echo " ",date("r", $file["lastmod"]),". يمكنك أيضًا تطبيق شروط إضافية بناءً على نوع الملف أو حجمه أو تاريخ آخر تعديل له.

إذا كنت، على سبيل المثال، تريد عرض صورة مصغرة، أو رابط لصورة أكبر، أو حتى مقطع فيديو، فما عليك سوى إعطاء هذين الملفين نفس الأسماء وفي البرنامج النصي أعلاه استخدمهما str_replaceأو وظيفة مماثلة لتعديل محتوى الروابط.

قائمة الدليل العودية

وبما أننا وصلنا إلى هذا الحد، فلن يكون هناك سوى تغييرات طفيفة في القائمة المتكررة ووظيفة استدعاء الفئات الفرعية. بإضافة معلمة ثانية إلى الوظيفة، فإننا نحتفظ بالوظيفة السابقة المتمثلة في إدراج دليل واحد.

read())) ( // تخطي الملفات المخفية if($entry == ".") continue; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ الإدخال/"، "الحجم" => 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 == ".") continue; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ الإدخال/"، "الحجم" => 0، "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( if($ Deep == = false) ( $retval = array_merge($retval, getFileList("$dir$entry/", true)); ) elseif($ Deep > 0) ( $retval = array_merge($retval, getFileList("$dir$entry" /"، صحيح، $عمق-1)); ) ) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size" => png("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->إغلاق();

إرجاع $retval؛ ) ؟>كما كان من قبل، أضفنا 1 فقط خطأ شنيعالمعلمة الجديدة

واثنين من أسطر التعليمات البرمجية. إذا لم يتم تحديد القيمة الافتراضية المسؤولة عن عمق العودية، فسيتم ضبطها على

. يتيح لنا ذلك التأكد من بقاء الميزات السابقة وأن التعليمات البرمجية اللاحقة لن "تنكسر" عندما تتغير الوظيفة.

العمل مع الملفات

إن الحاجة إلى العمليات مع الملفات تواجه المبرمج في كثير من الأحيان. إذا كانت البرامج النصية الخاصة بك لا تستخدم قواعد البيانات، فإن الملفات هي أجهزة التخزين الوحيدة المقبولة للبرنامج النصي. يتيح استخدام الملفات كمستودعات لمعلومات تنفيذ البرنامج النصي استخدامها في مجموعة متنوعة من المواقف. تتم كتابة جميع البرامج النصية المضادة تقريبًا بناءً على العمل مع الملفات. من الممكن أيضًا إعطاء مجموعة من الأمثلة الأخرى، ولكن حان الوقت للانتقال مباشرة من الأقوال إلى الأفعال.

أريد أن أقول على الفور أن العمل مع الملف يجب أن يكون مصرحًا به. بشكل افتراضي، PHP لا يسمح بمعالجة الملفات لأسباب أمنية. لإزالة هذا الحظر في مدير CuteFTP FTP، حدد جميع المربعات الموجودة في خصائص الملف؛ يجب أن يكون لدى المديرين الآخرين شيء مماثل. file_existsقبل تنفيذ العمليات على ملف ما، غالبًا ما تحتاج إلى التأكد من وجود الملف المحدد. هذا ما تفعله الدالة file_exists. يمكن لهذه الدالة إرجاع قيمتين فقط، كما يمكنك أن تتخيل حقيقي(إذا كان الملف المحدد موجودا) و

خطأ شنيع

. عادةً ما يبدو استخدام هذه الوظيفة كما يلي:

يرجى ملاحظة أن الوظيفة تعمل فقط على الملفات المحلية، أي إذا كنت تريد التحقق مما إذا كانت Yandex قد حصلت على ملف robot.txt، فستذهب جهودك سدى. ولكن من الممكن التحقق من أي ملف موجود على الخادم المحلي، بغض النظر عن دليل موقعه.

كما يوحي الاسم، تحدد الوظيفة حجم الملف وترجعه بالبايت. مفيد إذا كنت تريد التحقق من ملف لمعرفة ما إذا كان يحتوي على معلومات (كما قد تتخيل، يحتوي الملف الفارغ على 0 بايت)، ومن الممكن أيضًا التحقق من حجم الملف لمعرفة ما إذا كان يتجاوز حدًا معينًا.

ملف

تعمل هذه الوظيفة بالفعل مباشرة مع الملف. تقوم بإرجاع محتويات الملف المحدد، وتقوم بذلك في شكل مصفوفة، حيث يكون كل عنصر بمثابة سطر من الملف. تكون الوظيفة مفيدة عندما تحتاج إلى تخزين عدة قيم مختلفة في ملف واحد لا ينبغي أن تتقاطع. ثم يتم تخزين كل قيمة على سطر منفصل وقراءتها بواسطة وظيفة الملف، التي تقوم بإرجاع مصفوفة، بحيث يتم الوصول إلى المتغير المحدد عن طريق قراءة قيمة عنصر المصفوفة مع الفهرس المقابل للسطر الموجود في الملف.

من الممكن أيضًا إعادة توحيد كافة عناصر المصفوفة التي تم إرجاعها في متغير واحد. يتم ذلك باستخدام وظيفة الصفيف المنفجر.

com.fopen

إذا كانت الوظيفة السابقة قائمة بذاتها ولا تتعلق عمومًا بوظائف أخرى، فإن الوظائف اللاحقة للتعامل مع الملفات تعمل جنبًا إلى جنب مع fopen . تفتح هذه الوظيفة الملف المحدد وترجع معرف اتصال الملف المستخدم لأغراض الخدمة. لا ترتبط هذه الوظيفة بأي حال من الأحوال بمحتويات الملف.

تحتوي وظيفة fopen على عدة أوضاع للعمل مع ملف. يتم الإشارة إليها بعد اسم الملف وهي كما يلي:

    "ص"
    يتم فتح الملف لقراءة محتوياته فقط.

    "ص+"
    فتح ملف للقراءة والكتابة.

    "ث"
    الملف مفتوح لأغراض الكتابة.

    "ث+"
    فتح الملف للقراءة والكتابة.

    "أ"
    يتم فتح الملف للكتابة حتى نهاية الملف (إلحاق).

    "أ+"
    يفتح لمزيد من الكتابة والقراءة.

fgets

وظيفة قراءة ملف مفتوح بواسطة الدالة fopen. ولكن على عكس الملف، تقوم هذه الوظيفة بإرجاع سطر واحد فقط من الملف في كل مرة يتم تنفيذها، وتنقل مؤشر الملف الداخلي إلى السطر التالي، والذي سوف يقرأه في المرة التالية التي يتم فيها استدعاء الوظيفة. لذلك، إذا كنت بحاجة إلى قراءة الملف بأكمله، فستحتاج إلى استخدام هذه الوظيفة في حلقة.

لاحظ أن الدالة fgets تستخدم معلمة طول إضافية، والتي تحدد الحد الأقصى لطول سطر الملف المراد قراءته. إذا تجاوز حجم السلسلة هذا الرقم، فسوف تقوم الدالة بإعادته في شكل "مقطوع" من بايتات الطول. افتراضيًا، يتم تعيين هذه المعلمة على 1024 بايت، أو كيلو بايت واحد. انتبه بشكل خاص إلى هذه المعلمة إذا كنت تستخدم ملفات كبيرة، لأنه عند قراءة هذه الملفات، قد يفيض المخزن المؤقت لتنفيذ PHP (يشار إلى حجمه في ملف التكوين)، مما سيؤدي إلى التجميد.

لاحظ أن الملف المطلوب قراءته ليس اسم الملف، بل معرف اتصال الملف الذي يتم إرجاعه بواسطة الدالة fopen (في مثالنا، قيمة المتغير $file).

com.fputs

وظيفة كتابة المعلومات إلى ملف، ويتم ذلك وفقًا لمبدأ تشغيل وظيفة fgets، أي أنه يبدأ الكتابة من موضع مؤشر الملف الداخلي. بشكل عام، تشبه هذه الوظيفة ما ورد أعلاه في العديد من النواحي: فهي تستخدم أيضًا معلمة طول بيانات الكتابة، وهي أيضًا اختيارية.

com.f Close

كما كنت قد خمنت، تقوم هذه الوظيفة بإغلاق الملف المحدد. في الواقع، عند الانتهاء من البرنامج النصي، يقوم PHP نفسه بإغلاق جميع الملفات المفتوحة، ولكن لا يزال من الأفضل القيام بذلك يدويًا. كمعلمة دالة، يجب عليك تحديد معرف اتصال الملف.

لتوضيح مجموعة الوظائف المذكورة أعلاه، سنقدم مثالاً على إنشاء عداد زيارة بسيط.

$file = fopen("counter.txt", "r");
$c = fgets($file, 150);
فكلوز(ملف $);
$ج++;
$file = fopen("counter.txt", "w");
fputs(ملف $, $c);
فكلوز(ملف $);
صدى $ ج؛
?>

العمل مع الدلائل

ترتبط العمليات على الدلائل ارتباطًا وثيقًا بالإجراءات على الملفات. تشبه خوارزمية العمل معهم العمليات على الملفات: تحتاج أولاً إلى فتح الدليل وتنفيذ بعض الإجراءات وإغلاقه أخيرًا.

opendir

تفتح هذه الوظيفة الدليل المحدد وترجع معرف الخدمة لاتصال الدليل. ينبغي تحديد مسارات الدليل على النحو التالي:

النقطة تعني فتح الدليل الحالي

. /الملفات/

فتح مجلد ملفاتالموجود في الدليل الحالي

فتح مجلد بمستوى أعلى من المستوى الحالي

readdir

تقرأ الوظيفة الدليل الذي تم فتحه بواسطة opendir . لكل مرور، يقوم بإرجاع اسم الملف أو المجلد الموجود في الدليل المحدد ويحرك المؤشر الداخلي إلى كائن الدليل التالي. لذلك، لقراءة الدليل بأكمله، يجب استخدامه في حلقة.

تجدر الإشارة أيضًا إلى أن هذه الوظيفة تُرجع كائنات خدمة المجلد . و .. ، والتي يمكن قصها عند الإخراج بواسطة عبارة IF.

Closedir

نغلق الدليل، ونحدد معرف اتصال المجلد كوسيطة.

في بعض الأحيان، يؤدي استخدام وظائف الدليل إلى جعل الحياة أسهل كثيرًا. على سبيل المثال، في قسم الميزات، يمكنك رؤية قائمة الميزات مرتبة أبجديًا. هل يمكنك أن تتخيل مقدار الوقت الذي ستستغرقه كتابة هذه القائمة بأكملها يدويًا مع الروابط، وحتى بالترتيب الأبجدي. وهذا هو المكان الذي ساعدتني فيه وظائف العمل مع الدلائل. تم وضع كل دالة في ملف منفصل باسم مطابق لاسم الدالة، بدون أي امتدادات.

لذلك، في كل مرة تزور فيها الصفحة، تحصل على قائمة الوظائف التي تم إنشاؤها حديثًا.

هذا كل شيء. نراكم في الدرس القادم.

سرد الدليل هو عملية الحصول على معلومات حول الدلائل والملفات الخاصة بدليل أصل معين، بالإضافة إلى القدرة على تطبيق مرشحات مختلفة على هذه البيانات لتصحيح الإخراج.

في هذا المثال، سنحاول التعامل مع المهمة النموذجية التي تظهر في كل منها تقريبًا PHPالمشروع - الحصول على قائمة الدلائل و/أو الملفات. يستخدم المثال العديد من الأساليب الأساسية والأكثر تعقيدًا، موضحًا إيجابيات وسلبيات كل تقنية. تستخدم الحلول الثلاثة الأولى وظائف PHP القياسية. أحدث الحلول الأكثر موثوقية باستخدام مكررات PHP SPL.


للحصول على تمثيل أكثر وضوحًا، نستخدم بنية دليل تبدو كما يلي:


\-التطبيق | \-المستخدم | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

الحلول الأساسية
تستخدم المجموعة الأولى من الأمثلة الوظائف الكرة الأرضية ()ومجموعات من الوظائف أوبندير (), قراءة دير (), مغلق ()، وكذلك الوظيفة سكاندير ().

باستخدام الكرة الأرضية ()

مثال الاستخدام وظائف PHP الكرة الأرضية ()، والذي يسمح لك بالبحث عن مسار باستخدام النمط.
وظيفة الكرة الأرضية( نمط $,أعلام $) يعمل مع حجتين:
  • نمط $(مطلوب): سلسلة نمط البحث
  • أعلام $
    • GLOB_MARK- إضافة شرطة مائلة إلى كل دليل تم إرجاعه.
    • GLOB_NOSORT- إرجاع الملفات بالشكل الذي توجد به في الدليل (بدون فرز). إذا لم يتم تحديد هذه العلامة، فسيتم فرز الأسماء أبجديًا.
    • GLOB_NOCHECK- إرجاع نمط البحث إذا لم يتم العثور على ملفات تستخدمه.
    • GLOB_NOESCAPE- لا تفلت الخطوط المائلة العكسية من الأحرف التعريفية.
    • GLOB_BRACE- يوسع (أ، ب، ج) لمطابقة "أ"، "ب" أو "ج".
    • GLOB_ONLYDIR- إرجاع الدلائل المطابقة للنمط فقط.
    • GLOB_ERR- يتوقف عند أخطاء القراءة (على سبيل المثال، الدلائل دون إذن القراءة)، بشكل افتراضي يتم تجاهل الأخطاء.
للبحث في دليل عن كافة الملفات والأدلة التي تنتهي أسماؤها بـ .txt، استخدم الكود التالي:في الإخراج نحصل على النتيجة التالية: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) إذا كنت بحاجة للحصول على قائمة بالملفات والأدلة التي أسماؤها تبدأ ب "تي":في المخرجات نحصل على النتيجة التالية: array(2) ( => string(9) "test.html" => string(7) "test.js" ) الحصول فقط على الدلائل ذات الأسماء التي تحتوي على "er" في القائمة:في الإخراج نحصل على النتيجة التالية: array(1) ( => string(4) "User" )

المثال الأخير يستخدم العلم GLOB_ONLYDIRكوسيطة ثانية للوظيفة. لذلك، تم تضمين دليل "المستخدم" الموجود في الاسم فقط، والذي يحتوي على "er"، في القائمة. الدالة glob() سهلة الاستخدام للغاية، لكنها في بعض الأحيان لا تكون مرنة بدرجة كافية. لا توجد علامة للحصول على الملفات فقط (بدون أدلة) التي تطابق النمط.

باستخدام opendir()، readdir()، و Closedir().

الطريقة التالية للحصول على قائمة الملفات والأدلة هي استخدام وظائف PHP أوبندير (), قراءة دير ()و مغلق ().

وظيفة أوبندير ()إرجاع مؤشر إلى الدليل المفتوح. بمجرد استلام المقبض، يمكنك استخدام الوظيفة قراءة دير (). عند الوصول إلى المقبض، فإن الوظيفة قراءة دير ()يعرض اسم الملف أو الدليل التالي. إذا تم بالفعل تعداد كافة العناصر الموجودة في الواصف، فإن الوظيفة قراءة دير ()سوف يعود خطأ شنيع. لإغلاق الواصف نستخدم الدالة مغلق ().


على عكس استخدام وظيفة php ، هذا النهج أكثر تعقيدًا بعض الشيء. لا يمكن تعيين معلمات التصفية التي تساعد في إنشاء قائمة بأسماء الملفات والدلائل التي تم إرجاعها مسبقًا. للحصول على القائمة المطلوبة من الملفات والأدلة، يجب إجراء التصفية بشكل مستقل.


يعرض المثال التالي قائمة بأسماء الملفات والدلائل التي تبدأ بـ "Us":سيكون الإخراج: array(1) ( => string(4) "User" ) المثال التالي سيخرج فقط الملفات الموجودة في الدليل المحدد.في الإخراج نحصل على النتيجة التالية: array(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) "serial.txt" => string(10) "readme.txt" )

باستخدام سكاندير ().

في النهاية، دعونا نلقي نظرة على مثال لاستخدام وظيفة php سكاندير (). يحتوي على سمة واحدة مطلوبة فقط - المسار إلى دليل القراءة. نتيجة الدالة هي مجموعة من الملفات والدلائل الموجودة على طول المسار المحدد في الوسيطة. كما في المثال السابق، للحصول على قائمة من الملفات والأدلة التي تمت تصفيتها، يجب عليك تشغيلها بنفسك. بصريًا، الحل أقصر ولا يلزم إدارة الواصف.


يوضح المثال كيفية الحصول على قائمة بالملفات والأدلة التي تبدأ أسماؤها بـ "te":في الإخراج نحصل على النتيجة التالية: array(2) ( => string(9) "test.html" => string(7) "test.js" )

حل متقدم باستخدام PHP SPL
حل أكثر موثوقية باستخدام مكررات SPL FilesystemIterator, RecursiveDirectoryIteratorو GlobIterator.

باستخدام التكرارات SPL.

دعونا نلقي نظرة على استخدام مكررات SPL. قبل أن نبدأ في حل المشكلة، دعونا نتعرف قليلاً على مكتبة PHP SPL والمكررات. توفر مكتبة SPL مجموعات متخصصة من الفئات لهياكل البيانات الموجهة للكائنات والمكررات وواصفات الملفات والمزيد.


الميزة الرئيسية للمكررات هي أنها فئات ويمكن توسيعها باستخدام آلية قياسية PHP الميراثالطبقات. ميزة أخرى هي أن المكررات لديها أساليبها الخاصة التي يمكن أن تكون مفيدة لحل المشكلات الشائعة، وكلها موجودة في مكان واحد. دعونا نلقي نظرة على مثال للاستخدام FilesystemIteratorومقارنة مع قراءة دير (). كلتا الطريقتين تستخدمان حلقة، ولكن في حالة قراءة دير ()سيكون من الممكن معالجة السلسلة فقط، ولكن FilesystemIteratorيمكن أن تعمل مع كائن. والتي قد تحتوي على معلومات إضافية حول الملف أو الدليل مثل المالك والحجم وحقوق الوصول وما إلى ذلك.


وبطبيعة الحال، PHP لديه القدرة على الحصول على هذه المعلومات باستخدام الدوال، حجم الملف (), مالك الملف ()وغيرها. لكن PHP، مثل أي لغة برمجة، لديها القدرة على التغيير. في PHP5 هناك رغبة متزايدة في استخدام مفاهيم OOP. ولذلك فمن الأفضل استخدام الأساليب الحديثة في العمل مع لغة البرمجة.


النظر في استخدام FilesystemIterator, RecursiveDirectoryIteratorو GlobIterator. المكرر الأول يرث من DirectoryIterator، والباقي من FilesystemIterator. لديهم جميعًا نفس المنشئ، والذي يأخذ وسيطتين:

  • مسار $(إلزامي): المسار إلى عنصر نظام الملفات الذي يتم تنفيذ العمليات عليه
  • أعلام $(اختياري): علم واحد أو أكثر
    • مكرر نظام الملفات::CURRENT_AS_PATHNAMEيؤدي الأسلوب FilesystemIterator::current() إلى إرجاع المسار.
    • مكرر نظام الملفات::CURRENT_AS_FILEINFOيؤدي الأسلوب FilesystemIterator::current() إلى إرجاع مثيل SplFileInfo.
    • مكرر نظام الملفات::CURRENT_AS_SELFيؤدي الأسلوب FilesystemIterator::current() إلى إرجاع $this (FilesystemIterator).
    • مكرر نظام الملفات::CURRENT_MODE_MASKأقنعة FilesystemIterator::current()
    • مكرر نظام الملفات::KEY_AS_PATHNAMEيؤدي الأسلوب FilesystemIterator::key() إلى إرجاع المسار.
    • مكرر نظام الملفات::KEY_AS_FILENAMEيؤدي الأسلوب FilesystemIterator::key() إلى إرجاع اسم الملف.
    • مكرر نظام الملفات::FOLLOW_SYMLINKSيفرض التابع RecursiveDirectoryIterator::hasChildren()‎ اتباع الروابط الرمزية.
    • مكرر نظام الملفات::KEY_MODE_MASKأقنعة FilesystemIterator::key()
    • مكرر نظام الملفات::NEW_CURRENT_AND_KEYمثل FilesystemIterator::KEY_AS_FILENAME | مكرر نظام الملفات::CURRENT_AS_FILEINFO.
    • مكرر نظام الملفات::SKIP_DOTSتخطي الملفات النقطية (. و ..).
    • مكرر نظام الملفات::UNIX_PATHSيفرض على جميع المسارات استخدام الخطوط المائلة العكسية بنمط Unix، بغض النظر عن إعدادات النظام الافتراضية.

الفرق بين هذه التكرارات هو كيفية استخدامها للتنقل على طول مسار معين.

FilesystemIterator

يستخدم FilesystemIteratorبسيط جدا.
يوضح المثال البحث عن كافة الملفات والأدلة التي تبدأ أسماؤها بـ "te".

getFilename(),"te")===0): $arFileList = $obFile->getFilename();

نهاية؛ endforeach; // عرض النتيجة var_dump($arFileList); ?> في المخرجات نحصل على النتيجة التالية: array(2) ( => string(7) "test.js" => string(9) "test.html" ) مثال على استخدام مكرر آخر RegexIterator مثال على استخدام مكرر آخرللبحث عن كافة الملفات والمجلدات التي تنتهي أسماؤها بـ "t.js" أو "t.php". مكرر

يستخدم لتصفية النتيجة ويستخدم محرك التعبير العادي.

RecursiveDirectoryIterator

getFilename(); endforeach; // عرض النتيجة var_dump($arFileList); ?> في المخرجات نحصل على النتيجة التالية: array(2) ( => string(10) "script.php" => string(7) "test.js" ) RecursiveDirectoryIteratorمكرر يوفر واجهة لاجتياز أدلة نظام الملفات بشكل متكرر. لديها عدة طرق مفيدة مثلو الحصول على الأطفال () hasChildren()


RecursiveDirectoryIteratorو يوفر واجهة لاجتياز أدلة نظام الملفات بشكل متكرر. لديها عدة طرق مفيدة مثل. ، والذي يُرجع مكررًا للموقع الحالي إذا كان دليلاً، ويتحقق مما إذا كانت نقطة الإدخال الحالية دليلاً. getChildren(), "/t\.(txt|css)$/"); $arFileList = array(); foreach($rxIterator as $obFile): $arFileList = $obFile->getFilename(); endforeach; // عرض النتيجة var_dump($arFileList); ?> في الإخراج نحصل على النتيجة التالية:في هذه الحالة

GlobIterator

getFilename(); endforeach; // عرض النتيجة var_dump($arFileList); ?> في المخرجات نحصل على النتيجة التالية: array(2) ( => string(10) "script.php" => string(7) "test.js" ) GlobIteratorينفذ اجتياز ملف مشابه لـ . قد تتضمن السمة الأولى نمط اسم.


المثال يوضح الاستخدام GlobIteratorبنفس النتيجة كما كان من قبل.getFilename(); endforeach; // عرض النتيجة var_dump($arFileList); ?> في المخرجات نحصل على النتيجة التالية: array(2) ( => string(10) "/test.html" => string(8) "/test.js" )

خاتمة

تم النظر في الأمثلة المذكورة أعلاه طرق مختلفة PHP لتحقيق نفس الهدف: الحصول على قائمة الملفات والأدلة.

ويمكن تسليط الضوء على النقاط الرئيسية التالية من الأمثلة: