بعد أن لم أجد في أي مكان وصفًا تفسيريًا باللغة الروسية ، أي
نوع من ملفات الوحش
Files.walkFileTree () ، وقد أتقنت ذلك باستخدام صرير ، كما اتضح لاحقًا ، وظيفة بسيطة ، قررت أن أشارك المواد مع أمثلة كجزء من عملية التثبيت ، والتي فاتني حقًا.
تتيح لك طريقة walkFileTree () تجاوز شجرة الملفات والدلائل الفرعية التي تم تمريرها إليها كمعلمة لعنصر Path ...
اثنين من طريقة التوقيعاتFiles.walkFileTree(Path start, FileVisitor<? super Path> visitor); Files.walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor);
أين
بدء المسار - الدليل الذي سيتم تجاوز محتوياته ،
زائر FileVisitor - مثيل لفئة تقوم بتنفيذ واجهة FileVisitor ، أو ورثها من SimpleFileVisitor (). هذا الأخير ، في رأيي ، أكثر ملاءمة للاستخدام عندما لا تحتاج إلى إعادة تعريف جميع أساليب FileVisitor () ، والتي ستتم مناقشتها لاحقًا (لكن هذا يعتمد على الموقف) ،
اضبط خيارات <\ FileVisitOption> - مجموعة من الخيارات التي تحدد السلوك عند الزحف ،
maxDepth - عمق مرور الدلائل الفرعية.
أولاً ، حول المعلمات التي ستكون في متناول اليد عاجلاً أم آجلاً.maxDepth - عمق اجتياز. في = 0 ، لن يتم تنفيذ الإدخال في الدليل ، في = MAX_VALUE سيتم فحص الدليل إلى أقصى عمق ، على التوالي ، مع maxDepth = 3 ، سيتم تنفيذ المقطع في 3 أدلة فرعية "لأسفل".
FileVisitOption - enum عبارة عن مجموعة تحدد ما إذا كان يجب أن يتبع البرنامج روابط رمزية عند الزحف (في هذه الحالة ، يتم تحديد القيمة FileVisitOption.FOLLOW_LINKS).
FileVisitor - واجهة لديها 4 طرق:
1) FileVisitResult preVisitDirectory (T dir، BasicFileAttributes attrs) يلقي IOException؛يتضمن مجموعة من الطرق التي يجب اتباعها قبل زيارة الدليل الفرعي الحالي. على سبيل المثال ، من خلال attrs يمكنك الحصول عليها من البيانات مثل:
lastModifiedTime () ،
lastAccessTime () ،
createTime () ،
isRegularFile () - صحيح إذا كان لدينا ملف أمامنا ،
isDirectory () - صحيح إذا كان لدينا دليل
isSymbolicLink () - صحيح إذا كان الكائن رابط ،
isOther () - صحيح إذا كان الكائن المعني ليس ملفًا ، ولا دليلًا ، ولا رابطًا ،
size () - إرجاع حجم الكائن و
fileKey () - إرجاع مفتاح ملف أو فارغة.
إذا كنت تخطط لحساب عدد الدلائل أثناء عملية الزحف ، يجب ألا تنسَ أن دليل البداية سيؤخذ في الاعتبار في إجمالي المبلغ.
2) FileVisitResult visitFile (ملف T ، BasicFileAttributes attrs) يلقي IOException ؛مجموعة من الطرق التي يجب اتباعها أثناء زيارة الملف الحالي (على سبيل المثال ، يمكنك البحث في محتوياته والبحث عن تكرارات سلسلة البحث ، أو معرفة تاريخ آخر زيارة ، أو تغيير الملف ، أو إضافة حجم جميع الملفات للزحف إليها للحصول على حجم الدليل)
مثال public class MyFileVisitor extends SimpleFileVisitor<Path> { String partOfName; String partOfContent; @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { boolean containsName = true; if(partOfName!=null && !file.getFileName().toString().contains(partOfName)) containsName = false; String content = new String(Files.readAllBytes(file)); boolean containsContent = true; if(partOfContent!=null && !content.contains(partOfContent)) containsContent = false; if(containsName && containsContent) foundFiles.add(file); return FileVisitResult.CONTINUE; }
في هذا المثال ، عند اجتياز شجرة الملفات ، يتم فحص كل ملف للتنفيذ المتزامن لحدثين - ما إذا كان اسم الملف يحتوي على الإدخال المطلوب ، وما إذا كان الملف يحتوي على إدخالات السلسلة المطلوبة. عند استيفاء الشرطين ، تتم إضافة الملف إلى الورقة الناتجة ، وبعد ذلك يستمر تتبع الارتباطات ؛
أو
مثال آخر
على التحميل الزائد لطريقة visitFile
@Override public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException { if(path.toString().endsWith(".rar") || path.toString().endsWith(".zip")) archived.add(path.toString()); return FileVisitResult.CONTINUE; }
يضيف البرنامج أثناء اجتياز شجرة عند زيارة أحد الملفات ، في حالة كونه أرشيف مضغوط أو rar ، عنوانه (المسار) كسلسلة إلى قائمة ملفات الأرشيف ؛
3) FileVisitResult visitFileFailed (ملف T ، IOException exc) يلقي IOException ؛قد تكون هذه الطريقة مفيدة عندما يكون الوصول إلى ملف غير ناجح + "يكون قادرًا" على رمي استثناء. يمكن تعليم الباقي من خلال التعليق التوضيحي Override. على سبيل المثال ، احسب عدد الملفات التي تعذر الوصول إليها ؛
مثال @Override public FileVisitResult visitFileFailed(Path path, IOException exc) throws IOException { failed.add(path.toString()); return FileVisitResult.SKIP_SUBTREE; }
في حالة حدوث محاولة فاشلة للوصول إلى المسار ، تتم إضافة هذا المسار كسلسلة إلى القائمة الفاشلة من تلك المشابهة ، ويستمر البرنامج في التجاوز دون زيارة الدليل الفرعي الخاص به ؛
4) FileVisitResult postVisitDirectory (T dir، IOException exc) يلقي IOException؛يجب إدراج كل ما يجب القيام به بعد زيارة الدليل كجزء من التحميل الزائد لهذه الطريقة. على سبيل المثال ، من خلال تصفح الدليل وتدمير جميع الملفات الموجودة فيه ، يمكن لهذه الطريقة أيضًا تدميره بنفسه (نتذكر أن Files.delete (Path dir) يحذف الدليل فقط إذا كان فارغًا ولا يحتوي على ملفات).
مثال @Override public FileVisitResult postVisitDirectory(Path path, IOException exc) throws IOException { Files.delete(path); return FileVisitResult.CONTINUE; }
يتم إكمال جميع الطرق الموضحة أعلاه عن طريق إرجاع "نتائج الزيارة" (FileVisitResult) للكائن الذي ينتمي إلى مجموعة التعداد ويمكنه أخذ القيم التالية:
CONTINUE
- تواصل عبور الشجرة ؛TERMINATE
- ينتهي اجتياز شجرة.SKIP_SUBTREE
- يستمر في الالتفافية ، دون الانتقال إلى هذا الدليل ؛SKIP_SIBLINGS
- يستبعد من الزحف إلى "أقارب" هذا الملف أو الدليل ؛