জাভা, কেবল একটি ডিরেক্টরি থেকে সাব-ডাইরেক্টরিগুলি তালিকাবদ্ধ করুন, ফাইল নয়


102

জাভাতে, আমি কীভাবে কেবল একটি ডিরেক্টরি থেকে সাব-ডাইরেক্টরিগুলি তালিকাবদ্ধ করব?

আমি java.io.File কার্যকারিতাটি ব্যবহার করতে চাই, এটি করার জন্য জাভা সেরা পদ্ধতি কোনটি?

উত্তর:


143

ডিরেক্টরি তালিকাতে ফাইল ক্লাস ব্যবহার করতে পারেন ।

File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
  @Override
  public boolean accept(File current, String name) {
    return new File(current, name).isDirectory();
  }
});
System.out.println(Arrays.toString(directories));

হালনাগাদ

এই পোস্টে লেখকের কাছ থেকে মন্তব্যটি একটি দ্রুততর উপায়, দুর্দান্ত আলোচনা এখানে চেয়েছিল: জাভাতে খুব সহজেই ডিরেক্টরিগুলির একটি তালিকা পুনরুদ্ধার করবেন কীভাবে?

মূলত:

  1. আপনি যদি ফাইলের কাঠামোটি নিয়ন্ত্রণ করেন তবে আমি সেই পরিস্থিতিতে না এড়াতে চেষ্টা করব।
  2. জাভা NIO.2 এ, আপনি বৃহত্তর স্কেলিংয়ের অনুমতি দেওয়ার জন্য পুনরাবৃত্তিকে ফেরত দিতে ডিরেক্টরি ফাংশনটি ব্যবহার করতে পারেন। ডিরেক্টরি স্ট্রিম শ্রেণি হ'ল একটি বস্তু যা আপনি ডিরেক্টরিতে প্রবেশের মাধ্যমে পুনরাবৃত্তি করতে ব্যবহার করতে পারেন।

হাই, উত্তরের জন্য ধন্যবাদ কিন্তু আমি ডিরেক্টরিতে সমস্ত আইটেম পুনরাবৃত্তি করতে হবে না। আমাকে সরাসরি ডিরেক্টরি থেকে সাব ডিরেক্টরিটি তালিকাভুক্ত করতে হবে। ব'কোজ আমার কাছে প্রচুর ফাইল এবং একটি ডিরেক্টরিতে কেবল কয়েকটি সাব-ডাইরেক্টরি রয়েছে তাই, আইসডাইরেক্টরি () পরীক্ষা করা সময়সাপেক্ষ। দয়া করে আমাকে অন্যভাবে উত্তর দিন।
লোকেশ পৌণিকর

আমি আমার পোস্টটি আপডেট করেছি, বিশেষত, প্রশ্নটিতে জোন স্কিট মন্তব্যটি একবার দেখুন। এবং জাভা এনআইও 2 যেহেতু NIO প্রতিক্রিয়া ডিরেক্টরি ফাংশন ফেরত ডিরেক্টরি ফাংশন জন্য একটি পুনরাবৃত্তি আছে।
মোহাম্মদ মনসুর

আপনি কী স্কিটি মন্তব্য উল্লেখ করছেন? এখানে আরও ভাল পারফরম্যান্সের উত্তরটি কী?
স্টিলথ রাব্বি

108

একটি খুব সাধারণ জাভা 8 সমাধান:

File[] directories = new File("/your/path/").listFiles(File::isDirectory);

এটি ফাইলফিল্টার ব্যবহারের সমতুল্য (পুরানো জাভাতেও কাজ করে):

File[] directories = new File("/your/path/").listFiles(new FileFilter() {
    @Override
    public boolean accept(File file) {
        return file.isDirectory();
    }
});

5
::এই উদাহরণে ডাবল কোলন কীভাবে কাজ করবে?
snickers10

আমি লক্ষ্য করেছি যে অন্য কোনও উত্তর ফাইলফিল্টার ব্যবহার করে না তাই আমি পদ্ধতি উল্লেখগুলি ব্যবহার না করে সমতুল্য সংস্করণ যুক্ত করেছি। পদ্ধতির রেফারেন্স সম্পর্কে আরও তথ্যের জন্য, এই এসও প্রশ্ন বা এই নিবন্ধটি দেখুন
Headvk

এটি কি সরাসরি / আপনার / পাথ / এর অধীনে উপ-ডিরেক্টরি বা কেবল ডিরেক্টরিগুলি পাই?
আমাদাইন

@amadain প্রত্যাশিত ডকস
javase/

14

@ মোহাম্মদ মনসুর আপনি প্রায় সেখানেই ছিলেন ... আপনি যে "দির" যুক্তিটি ব্যবহার করছেন তা আসলে নিরাময় পথ, তাই এটি সর্বদা সত্য হবে। শিশুটি একটি উপ-ডিরেক্টরি বা না তা দেখার জন্য আপনাকে সেই শিশুটিকে পরীক্ষা করা দরকার।

File file = new File("/path/to/directory");
String[] directories = file.list(new FilenameFilter() {
  @Override
  public boolean accept(File current, String name) {
    return new File(current, name).isDirectory();
  }
});
System.out.println(Arrays.toString(directories));

7

আপনি যদি জাভা 7 এবং NIO.2 ব্যবহার করে কোনও সমাধানে আগ্রহী হন তবে এটি এরকম হতে পারে:

private static class DirectoriesFilter implements Filter<Path> {
    @Override
    public boolean accept(Path entry) throws IOException {
        return Files.isDirectory(entry);
    }
}

try (DirectoryStream<Path> ds = Files.newDirectoryStream(FileSystems.getDefault().getPath(root), new DirectoriesFilter())) {
        for (Path p : ds) {
            System.out.println(p.getFileName());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

3
ArrayList<File> directories = new ArrayList<File>(
    Arrays.asList(
        new File("your/path/").listFiles(File::isDirectory)
    )
);

হাই, এবং স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম! আপনি কি নিজের উত্তরটি কিছুটা বিশদভাবে বলতে পারবেন? আপনার কোড স্নিপেটের আকর্ষণীয় অংশগুলি ব্যাখ্যা করার মতো বা আরও পড়ার জন্য ডকুমেন্টেশনের সাথে লিঙ্ক করার মতো?
রিচার্ড-দেগেন

এটি সঠিক উত্তর হওয়া উচিত কারণ এটি সম্পূর্ণ ক্যানোনিকাল পাথ সহ কোনও ফাইল অবজেক্ট সরবরাহ করে। এটি পুরানো হতে পারে তবে এটি উল্লেখ করার মতো
জেরো ডুঙ্গোগ

3

আমি java.io.File কার্যকারিতা ব্যবহার করতে চাই,

২০১২ সালে (প্রশ্নের তারিখ) হ্যাঁ, আজ নয়। java.nioএ জাতীয় প্রয়োজনীয়তার জন্য এপিআইর পক্ষে যেতে হবে।

অনেক উত্তর দিয়ে ভয়ঙ্কর, তবে আমি যে সহজ উপায়টি ব্যবহার করব তা নয় Files.walk().filter().collect()

বিশ্বব্যাপী দুটি পদ্ধতি সম্ভব:

1) যখন Files.walk(Path start, )কোন maxDepthসীমাবদ্ধতা আছে

2) Files.walk(Path start, int maxDepth, FileVisitOption... options)এটি সেট করার অনুমতি দেয়।

কোনও গভীরতার সীমাবদ্ধতা নির্দিষ্ট না করেই এটি দেবে:

Path directory = Paths.get("/foo/bar");

try {
    List<Path> directories =
            Files.walk(directory)
                 .filter(Files::isDirectory)
                 .collect(Collectors.toList());
} catch (IOException e) {
    // process exception
}

এবং যদি উত্তরাধিকারগত কারণে, আপনার সংগ্রহের আগে Fileএকটি map(Path::toFile)ক্রিয়াকলাপ যোগ করতে পারেন আপনার একটি তালিকা পাওয়া দরকার :

Path directory = Paths.get("/foo/bar");

try {
    List<File> directories =
            Files.walk(directory)
                 .filter(Files::isDirectory)
                 .map(Path::toFile)
                 .collect(Collectors.toList());
} catch (IOException e) {
    // process exception
}

এছাড়াও রয়েছে Files.list(Path)সম্ভবত হিসাবে একই Files.walk(Path,1)
ডেভিড এল।

@ ডেভিড এল প্রকৃতপক্ষে Files.list(Path)একটি সঠিক বিকল্প যদি আমরা পুনরাবৃত্তভাবে ফোল্ডারগুলি পুনরাবৃত্তি করতে না চাই। পুনরাবৃত্তভাবে ফোল্ডার পুনরাবৃত্তি করতে, walk()আরও ভাল ফিট করে।
ডেভিডএক্সএক্সএক্সএক্স

2

যাঁরা জাভা 7 এবং এনআইও-তে আগ্রহী তাদের জন্য উপরে @ voo এর উত্তরের একটি বিকল্প সমাধান রয়েছে । আমরা একটি চেষ্টা-সহ-সংস্থানগুলি কল করতে পারি Files.find()এবং একটি ল্যাম্বডা ফাংশন ব্যবহার করতে পারি যা ডিরেক্টরিগুলি ফিল্টার করতে ব্যবহৃত হয়।

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.stream.Stream;


final Path directory = Paths.get("/path/to/folder");

try (Stream<Path> paths = Files.find(directory, Integer.MAX_VALUE, (path, attributes) -> attributes.isDirectory())) {
    paths.forEach(System.out::println);
} catch (IOException e) {
    ...
}

আমরা এমনকি ল্যাম্বদা ফাংশন পরিবর্তন করে নামগুলি দ্বারা ফিল্টার করতে পারি:

(path, attributes) -> attributes.isDirectory() && path.toString().contains("test")

বা তারিখ দ্বারা:

final long now = System.currentTimeMillis();
final long yesterday = new Date(now - 24 * 60 * 60 * 1000L).getTime();

// modified in the last 24 hours
(path, attributes) -> attributes.isDirectory() && attributes.lastModifiedTime().toMillis() > yesterday

1

আমার জন্য যে সমাধানটি কাজ করেছিল, সেগুলি উত্তরগুলির তালিকা থেকে নিখোঁজ। তাই আমি এই সমাধানটি এখানে পোস্ট করছি:

File[]dirs = new File("/mypath/mydir/").listFiles((FileFilter)FileFilterUtils.directoryFileFilter());

এখানে আমি org.apache.commons.io.filefilter.FileFilterUtilsঅ্যাপাচি কমন্স- io-2.2.jar থেকে ব্যবহার করেছি। এর ডকুমেন্টেশনটি এখানে উপলভ্য: https://commons.apache.org/proper/commons-io/javadocs/api-2.2/org/apache/commons/io/filefilter/FileFilterUtils.html


0

একটি হিসাবে একটি সূচনা ডিরেক্টরি দেওয়া String

  1. Stringপ্যারামিটার হিসাবে একটি পদক্ষেপ নেয় এমন একটি পদ্ধতি তৈরি করুন । পদ্ধতিতে:
  2. প্রারম্ভিক ডিরেক্টরিটির ভিত্তিতে একটি নতুন ফাইল অবজেক্ট তৈরি করুন
  3. listFilesপদ্ধতিটি ব্যবহার করে বর্তমান ডিরেক্টরিতে ফাইলগুলির একটি অ্যারে পান
  4. ফাইলগুলির অ্যারের উপরে লুপ করুন
    1. যদি এটি কোনও ফাইল হয় তবে লুপিং চালিয়ে যান
    2. যদি এটি কোনও ডিরেক্টরি হয় তবে নামটি মুদ্রণ করুন এবং এই নতুন ডিরেক্টরি পথে পুনরাবৃত্তি করুন

হাই, উত্তরের জন্য ধন্যবাদ কিন্তু আমি ডিরেক্টরিতে সমস্ত আইটেম পুনরাবৃত্তি করতে হবে না। আমাকে সরাসরি ডিরেক্টরি থেকে সাব ডিরেক্টরিটি তালিকাভুক্ত করতে হবে। ব'কোজ আমার কাছে প্রচুর ফাইল এবং একটি ডিরেক্টরিতে কেবল কয়েকটি সাব-ডাইরেক্টরি রয়েছে তাই, আইসডাইরেক্টরি () পরীক্ষা করা সময়সাপেক্ষ। দয়া করে আমাকে অন্যভাবে উত্তর দিন।
লোকেশ পৌণিকর

0

আমার কোডের সমাধান এখানে solution আমি প্রথম উত্তর থেকে একটি লিটল পরিবর্তন করেছি । এটি সমস্ত ফোল্ডারগুলিকে কেবল পছন্দসই ডিরেক্টরি লাইনে লাইন দ্বারা তালিকাবদ্ধ করবে:

try {
            File file = new File("D:\\admir\\MyBookLibrary");
            String[] directories = file.list(new FilenameFilter() {
              @Override
              public boolean accept(File current, String name) {
                return new File(current, name).isDirectory();
              }
            });
            for(int i = 0;i < directories.length;i++) {
                if(directories[i] != null) {
                    System.out.println(Arrays.asList(directories[i]));

                }
            }
        }catch(Exception e) {
            System.err.println("Error!");
        }

0

আপনি জাভা 7 ফাইল এপিআই ব্যবহার করতে পারেন

Path myDirectoryPath = Paths.get("path to my directory");
List<Path> subDirectories = Files.find(
                    myDirectoryPath ,
                    Integer.MAX_VALUE,
                    (filePath, fileAttr) -> fileAttr.isDirectory() && !filePath.equals(myDirectoryPath )
            ).collect(Collectors.toList());

আপনি যদি একটি নির্দিষ্ট মান চান তবে ডেটা সংগ্রহের আগে আপনি যে মানটি চান তা দিয়ে ম্যাপটিতে কল করতে পারেন।


0
    File files = new File("src");
    // src is folder name...
    //This will return the list of the subDirectories
    List<File> subDirectories = Arrays.stream(files.listFiles()).filter(File::isDirectory).collect(Collectors.toList());
// this will print all the sub directories
Arrays.stream(files.listFiles()).filter(File::isDirectory).forEach(System.out::println);

0

এটি আক্ষরিকভাবে সমস্ত উপ-ডিরেক্টরি তালিকাভুক্ত করবে (এটি মুদ্রণ করবে)। এটি মূলত এমন একটি লুপ যেখানে আপনার কোনও তালিকার মাঝে আইটেমগুলি সংরক্ষণ করার প্রয়োজন নেই। সম্ভবত এটির জন্য একটি প্রয়োজন, তাই আমি এটি এখানে রেখেছি।

Path directory = Paths.get("D:\\directory\\to\\list");

Files.walk(directory, 1).filter(entry -> !entry.equals(directory))
    .filter(Files::isDirectory).forEach(subdirectory ->
{
    // do whatever you want with the subdirectories
    System.out.println(subdirectory.getFileName());
});
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.