0Pricing
Java Academy · درس

استعراض أشجار المجلدات باستخدام Files.walk

اعرض الملفات تكراريًا، وصفِّها حسب الامتداد، واحسب أحجام المجلدات باستخدام Files.walk

استعراض أشجار المجلدات باستخدام Files.walk درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

نظرة عامة على Files.walk

تعيد Files.walk(startPath) دفقًا كسولًا من النوع Stream<Path> يسرد جميع الملفات والأدلة بشكل متكرر بدءًا من المسار المحدد. ويجري العبور بترتيب العمق أولًا، مع تضمين مسار البداية نفسه.

import java.nio.file.*;
import java.util.stream.*;

try (Stream<Path> stream = Files.walk(Path.of("/home/user/projects"))) {
    stream.forEach(System.out::println);
} // stream and underlying resources closed automatically

تحديد العمق

حدّد أقصى عمق لمنع التكرار العميق:

Path root = Path.of("/home/user/projects");

// Only immediate children (depth 1)
try (var stream = Files.walk(root, 1)) {
    stream.filter(p -> !p.equals(root)) // exclude start path
          .forEach(System.out::println);
}

التصفية حسب نوع الملف

اجمع بين ذلك وبين Files.isRegularFile() أو Files.isDirectory() لإجراء التصفية:

Path root = Path.of(".");

try (var stream = Files.walk(root)) {
    long fileCount = stream
        .filter(Files::isRegularFile)
        .count();
    System.out.println("Files: " + fileCount);
}

التصفية حسب الامتداد

اعثر على جميع الملفات ذات امتداد محدد:

try (var stream = Files.walk(Path.of("/src"))) {
    List<Path> javaFiles = stream
        .filter(Files::isRegularFile)
        .filter(p -> p.toString().endsWith(".java"))
        .collect(Collectors.toList());
    javaFiles.forEach(System.out::println);
}

حساب حجم الدليل

اجمع أحجام جميع الملفات الموجودة ضمن دليل:

try (var stream = Files.walk(Path.of("/home/user/data"))) {
    long totalBytes = stream
        .filter(Files::isRegularFile)
        .mapToLong(p -> {
            try { return Files.size(p); }
            catch (IOException e) { return 0; }
        })
        .sum();
    System.out.printf("Total: %.2f MB%n", totalBytes / 1_048_576.0);
}

Files.list مقابل Files.walk

تسرد Files.list(dir) المحتويات المباشرة فقط لدليل واحد (مثل ls). أما Files.walk فتتكرر داخل الأدلة الفرعية.

// Only immediate children:
try (var stream = Files.list(Path.of("/home/user"))) {
    stream.forEach(System.out::println);
}

‏Files.find للبحث المستند إلى السمات

تكون Files.find(root, depth, matcher) أكثر كفاءة من الجمع بين walk وfilter عند المطابقة حسب سمات الملف:

import java.nio.file.attribute.BasicFileAttributes;

try (var stream = Files.find(
        Path.of("/home/user"),
        Integer.MAX_VALUE,
        (p, attrs) -> attrs.isRegularFile() && attrs.size() > 1_000_000
)) {
    stream.forEach(p -> System.out.println("Large file: " + p));
}

حذف شجرة أدلة

استخدم walk + sorted(reversed) لحذف دليل وجميع محتوياته (بدءًا من الملفات الأعمق):

Path toDelete = Path.of("/tmp/workdir");
try (var stream = Files.walk(toDelete)) {
    stream.sorted(Comparator.reverseOrder())
          .forEach(p -> {
              try { Files.delete(p); }
              catch (IOException e) { e.printStackTrace(); }
          });
}

نسخ شجرة أدلة

اعبر شجرة المصدر وانسخ كل ملف مع الحفاظ على بنية الأدلة:

Path src = Path.of("/source"), dst = Path.of("/destination");
try (var stream = Files.walk(src)) {
    stream.forEach(p -> {
        try {
            Path target = dst.resolve(src.relativize(p));
            if (Files.isDirectory(p)) Files.createDirectories(target);
            else Files.copy(p, target, StandardCopyOption.REPLACE_EXISTING);
        } catch (IOException e) { throw new RuntimeException(e); }
    });
}

التعامل مع الملفات التي يتعذر الوصول إليها

يطرح Files.walk استثناء IOException إذا صادف دليلًا يتعذر عليه قراءته. استخدم FileVisitOption.FOLLOW_LINKS بحذر — فقد تؤدي حلقات الروابط الرمزية إلى تكرار لا نهائي.

try (var stream = Files.walk(Path.of("/"),
        FileVisitOption.FOLLOW_LINKS)) { // caution: symlink loops
    // ...
} catch (IOException e) {
    System.err.println("Access error: " + e.getMessage());
}

walkFileTree: العبور المستند إلى الأحداث

للحصول على تحكم أدق (قبل الزيارة وبعدها ومعالجة الأخطاء)، استخدم Files.walkFileTree() مع FileVisitor:

Files.walkFileTree(Path.of("/home/user"), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
        System.out.println("File: " + file);
        return FileVisitResult.CONTINUE;
    }
    @Override
    public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
        System.out.println("Dir: " + dir);
        return FileVisitResult.CONTINUE;
    }
});

تحقق سريع

ما أسلوب Files الذي ينبغي استخدامه لسرد الأبناء المباشرين فقط لدليل (من دون تكرار)؟

مراجعة: Files.walk

أهم النقاط:

  • Files.walk(root) — دفق كسول ومتكرر لجميع المسارات
  • استخدم دائمًا try-with-resources لإغلاق الدفق
  • أجرِ التصفية باستخدام Files.isRegularFile/isDirectory؛ وللتصفية حسب الامتداد استخدم endsWith
  • Files.list(dir) — الأبناء المباشرون فقط
  • Files.find — بحث فعال مستند إلى السمات
  • walkFileTree — عبور مستند إلى الأحداث مع عمليات استدعاء قبل الزيارة وبعدها

الأسئلة الشائعة

هل درس «استعراض أشجار المجلدات باستخدام Files.walk» مجاني؟

نعم — نص درس «استعراض أشجار المجلدات باستخدام Files.walk» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «استعراض أشجار المجلدات باستخدام Files.walk»؟

اعرض الملفات تكراريًا، وصفِّها حسب الامتداد، واحسب أحجام المجلدات باستخدام Files.walk تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «استعراض أشجار المجلدات باستخدام Files.walk»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Path: تمثيل مواقع الملفات
  2. أداة Files: القراءة والكتابة والنسخ والنقل
  3. استعراض أشجار المجلدات باستخدام Files.walk
  4. WatchService: مراقبة تغييرات الملفات
← العودة إلى Java Academy