ডিরেক্টরি থেকে সমস্ত ফাইল জাভা দিয়ে পুনরাবৃত্তভাবে তালিকাবদ্ধ করুন


86

আমার এই ফাংশনটি রয়েছে যা একটি ডিরেক্টরিতে পুনরাবৃত্তভাবে সমস্ত ফাইলের নাম মুদ্রণ করে। সমস্যাটি হ'ল আমার কোডটি খুব ধীর কারণ এটি প্রতিটি পুনরাবৃত্তির সাথে একটি রিমোট নেটওয়ার্ক ডিভাইস অ্যাক্সেস করতে পারে।

আমার পরিকল্পনাটি হ'ল প্রথমে ডিরেক্টরি থেকে সমস্ত ফাইলগুলি পুনরাবৃত্তভাবে লোড করা যায় এবং তারপরে আমি চাই না এমন সমস্ত ফাইলগুলি ফিল্টার করার জন্য রেজেনেক্সের সাথে সমস্ত ফাইলের মধ্য দিয়ে। কারও কি এর চেয়ে ভাল পরামর্শ আছে?

public static printFnames(String sDir){
  File[] faFiles = new File(sDir).listFiles();
  for(File file: faFiles){
    if(file.getName().matches("^(.*?)")){
      System.out.println(file.getAbsolutePath());
    }
    if(file.isDirectory()){
      printFnames(file.getAbsolutePath());
    }
  }
}

এটি পরে একটি পরীক্ষা হ'ল আমি এই জাতীয় কোডটি ব্যবহার করব না, পরিবর্তে আমি প্রতিটি ফাইলের পথ এবং পরিবর্তনের তারিখ যুক্ত করব যা একটি অ্যারেতে একটি অ্যাডভান্সড রেজেক্সের সাথে মেলে।


4
... প্রশ্নটি কি? আপনি কি এই কোডটি কার্যকর করবে এমন বৈধতা খুঁজছেন?
রিচার্ড জে পি লে গুয়েন

না, আমি জানি এই কোডটি কাজ করে তবে এটি খুব ধীর এবং এটি মনে হয় যে এটি ফাইল সিস্টেমে বোকামি অ্যাক্সেস করে এবং একবারে সবকিছু পাওয়ার পরিবর্তে প্রতিটি উপ-ডিরেক্টরিতে সামগ্রীগুলি পেয়ে যায়।
হাল্টনার

উত্তর:


134

ধরে নিচ্ছি এটি প্রকৃত উত্পাদন কোড যা আপনি লিখবেন, তারপরে আমি ইতিমধ্যে সমাধান করা এই ধরণের জিনিসটির সমাধানটি ব্যবহার করার পরামর্শ দিচ্ছি - অ্যাপাচি কমন্স আইও , বিশেষত FileUtils.listFiles()। এটি নেস্টেড ডিরেক্টরি, ফিল্টারগুলি (নাম, পরিবর্তনের সময় ইত্যাদির উপর ভিত্তি করে) পরিচালনা করে।

উদাহরণস্বরূপ, আপনার রেজেক্সের জন্য:

Collection files = FileUtils.listFiles(
  dir, 
  new RegexFileFilter("^(.*?)"), 
  DirectoryFileFilter.DIRECTORY
);

এটি পুনরাবৃত্তভাবে ^(.*?)রেজেজের সাথে মিলে যাওয়া ফাইলগুলির অনুসন্ধান করবে , ফলাফল হিসাবে সংগ্রহ হিসাবে ফিরে আসবে।

এটি আপনার নিজের কোড ঘূর্ণায়মানের চেয়ে দ্রুত আর দ্রুত হবে না, এটি একই জিনিসটি করে চলেছে - জাভাতে একটি ফাইল সিস্টেম ট্রল করা খুব ধীর। পার্থক্যটি হ'ল, অ্যাপাচি কমন্স সংস্করণটিতে কোনও বাগ থাকবে না।


আমি সেখানে তাকিয়েছিলাম এবং সেখান থেকে আমি Commons.apache.org/io/api-release/index.html?org/apache/commons/… ব্যবহার করব ডিরেক্টরি এবং উপ-ডিরেক্টরিগুলি থেকে সমস্ত ফাইল পেতে এবং তারপরে ফাইলগুলির মাধ্যমে অনুসন্ধান করব যাতে তারা আমার regex মেলে। নাকি আমি ভুল করছি?
হাল্টনার

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

4
নেটিভ কলগুলি ব্যবহার করে এটি লিখন একেবারে দ্রুততর করে তুলবে - ফাইন্ডফার্সফায়ার / ফিননেস্টফাইলে আপনাকে আলাদা আলাদা কল না করেই ফাইলের বৈশিষ্ট্যগুলি অনুসন্ধান করতে দেয় - উচ্চতর ল্যাটেন্সি নেটওয়ার্কগুলির জন্য এটির বিশাল প্রভাব থাকতে পারে। জাভা এর এই পদ্ধতির মারাত্মকভাবে অদক্ষ।
কেভিন ডে

4
@ হাঞ্জাল্লাহ-আফগান: প্রশ্নোত্তর উভয়ই পাঁচ বছরেরও বেশি পুরনো। অতীতের সময়ে দুটি বড় জাভা রিলিজ হয়েছে যাতে আপনি জাভা 7 এনআইওর মতো নতুন বৈশিষ্ট্যগুলি তদন্ত করতে চান না।
হাল্টনার

4
পারফরম্যান্স হিট: github.com/brettryan/io-recurse-tests সম্পর্কে যদি আপনি সচেতন হন এবং গ্রহণ করেন তবে কেবল ফাইল ইউটিলেটগুলি ব্যবহার করুন । নেটিভ জাভা 8 বিকল্পগুলি সংক্ষিপ্ত এবং আরও দক্ষ স্বরলিখনের জন্য অনুমতি দেয় যেমন:Files.walk(Paths.get("/etc")).filter(Files::isRegularFile).collect(Collectors.toList())
সিসিপিজ্জা

66

জাভা 8-এ, এটি 1-লাইনারের মাধ্যমে Files.find()একটি ইচ্ছামত বৃহত্তর গভীরতা (যেমন 999) এবং BasicFileAttributesএর মাধ্যমেisRegularFile()

public static printFnames(String sDir) {
    Files.find(Paths.get(sDir), 999, (p, bfa) -> bfa.isRegularFile()).forEach(System.out::println);
}

আরও ফিল্টারিং যুক্ত করতে ল্যাম্বডা বাড়িয়ে নিন, উদাহরণস্বরূপ, সমস্ত জেপিজি ফাইলগুলি গত 24 ঘন্টা সংশোধিত হয়েছে:

(p, bfa) -> bfa.isRegularFile()
  && p.getFileName().toString().matches(".*\\.jpg")
  && bfa.lastModifiedTime().toMillis() > System.currentMillis() - 86400000

4
আমি সর্বদা সেই ফাইল পদ্ধতিগুলি ব্যবহার করার পরামর্শ দিচ্ছি যা রিসোর্স ব্লকগুলিতে চেষ্টা করে স্ট্রিম দেয়: অন্যথায় আপনি সংস্থানটি খোলা রাখবেন
riccardo.tasso

টার্মিনাল ক্রিয়াকলাপগুলি স্ট্রিমের কাছেই কল বন্ধ করে দেয় না?
Dragas

@ ড্রাগাস হ্যাঁ আমার গ্রাহক কেবল একটি সাধারণ উদাহরণ; বাস্তব জীবনে আপনি আরও দরকারী কিছু করতে হবে।
বোহেমিয়ান

27

প্রদত্ত মূল থেকে সমস্ত ফাইল পেতে এটি একটি খুব সহজ পুনরাবৃত্ত পদ্ধতি method

এটি জাভা 7 এনআইও পাথ ক্লাস ব্যবহার করে।

private List<String> getFileNames(List<String> fileNames, Path dir) {
    try(DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) {
        for (Path path : stream) {
            if(path.toFile().isDirectory()) {
                getFileNames(fileNames, path);
            } else {
                fileNames.add(path.toAbsolutePath().toString());
                System.out.println(path.getFileName());
            }
        }
    } catch(IOException e) {
        e.printStackTrace();
    }
    return fileNames;
} 

18

জাভা 7 এর সাথে একটি ডিরেক্টরি গাছের মধ্য দিয়ে দ্রুত গতিতে চলার উপায়টি Pathsএবং Filesকার্যকারিতাটি চালু হয়েছিল । তারা "পুরাতন" তখন অনেক দ্রুতFile পথে ।

এটি নিয়মিত অভিব্যক্তি সহ পথের নাম এবং চেক করার কোড হবে:

public final void test() throws IOException, InterruptedException {
    final Path rootDir = Paths.get("path to your directory where the walk starts");

    // Walk thru mainDir directory
    Files.walkFileTree(rootDir, new FileVisitor<Path>() {
        // First (minor) speed up. Compile regular expression pattern only one time.
        private Pattern pattern = Pattern.compile("^(.*?)");

        @Override
        public FileVisitResult preVisitDirectory(Path path,
                BasicFileAttributes atts) throws IOException {

            boolean matches = pattern.matcher(path.toString()).matches();

            // TODO: Put here your business logic when matches equals true/false

            return (matches)? FileVisitResult.CONTINUE:FileVisitResult.SKIP_SUBTREE;
        }

        @Override
        public FileVisitResult visitFile(Path path, BasicFileAttributes mainAtts)
                throws IOException {

            boolean matches = pattern.matcher(path.toString()).matches();

            // TODO: Put here your business logic when matches equals true/false

            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult postVisitDirectory(Path path,
                IOException exc) throws IOException {
            // TODO Auto-generated method stub
            return FileVisitResult.CONTINUE;
        }

        @Override
        public FileVisitResult visitFileFailed(Path path, IOException exc)
                throws IOException {
            exc.printStackTrace();

            // If the root directory has failed it makes no sense to continue
            return path.equals(rootDir)? FileVisitResult.TERMINATE:FileVisitResult.CONTINUE;
        }
    });
}

4
চমৎকার উত্তর :), এটির একটি প্রয়োগকৃত ক্লাসও রয়েছে যার নাম "সিম্পলফিলভিসিটার" রয়েছে, যদি আপনার সমস্ত প্রয়োগকৃত ফিকশনগুলির প্রয়োজন না হয় তবে আপনি কেবল প্রয়োজনীয় ফাংশনগুলিকে ওভাররাইড করতে পারেন।
গালডুড 33

13

জাভা 7 এনআইও ব্যবহার করে কোনও ডিরেক্টরিতে সামগ্রীর সামগ্রী পাওয়ার দ্রুত উপায়:

import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.FileSystems;
import java.nio.file.Path;

...

Path dir = FileSystems.getDefault().getPath( filePath );
DirectoryStream<Path> stream = Files.newDirectoryStream( dir );
for (Path path : stream) {
   System.out.println( path.getFileName() );
}
stream.close();

4
দুর্দান্ত তবে কেবল একটি ডিরেক্টরিতে ফাইল পাওয়া যায়। আপনি যদি সমস্ত উপ ডিরেক্টরি দেখতে চান তবে আমার বিকল্প উত্তরটি দেখুন।
ড্যান

4
Files.newDirectoryStreamএকটি IOException নিক্ষেপ করতে পারেন। আমি সেই জাভাটি 7 কে জাভা-সহ-বিবৃতিতে জড়ানোর পরামর্শ দিচ্ছি যাতে আপনার জন্য স্ট্রিমটি সর্বদা বন্ধ থাকবে (ব্যতিক্রম বা না, কোনও প্রয়োজন ছাড়াই finally)। এখানে আরও দেখুন: স্ট্যাকওভারফ্লো.com
গ্রেগ

12

ফাইল সিস্টেম ফোল্ডার সামগ্রীগুলি পড়ার জন্য জাভার ইন্টারফেস খুব পারফরম্যান্ট নয় (যেমন আপনি আবিষ্কার করেছেন)। জেডিকে 7 এই ধরণের জিনিসটির জন্য সম্পূর্ণ নতুন ইন্টারফেসের সাথে এটি ঠিক করে, যা এই ধরণের ক্রিয়াকলাপে দেশীয় স্তরের পারফরম্যান্স নিয়ে আসে bring

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

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

এই ধরণের জিনিস সম্পর্কে আপনার সমস্ত আলোচনার ক্ষেত্রে, আমি আপনাকে সুপারিশ করি যে আপনি নেটিভ কোড ব্যবহার করে (বা এমনকি কোনও কমান্ড লাইন স্ক্রিপ্ট যা মোটামুটি একই জিনিসটি করে) ব্যবহার করে আপনি সর্বোত্তম তুলনায় তুলনা করুন। এটি বলে যে কোনও নেটওয়ার্ক কাঠামোকে অতিক্রম করতে এক ঘন্টা সময় লাগে তার অর্থ আসলে এর বেশি নয়। আমাদের বলছেন যে আপনি এটি 7 সেকেন্ডে নেটিভ করতে পারেন, তবে জাভাতে এটি এক ঘন্টা সময় নেয় মানুষের দৃষ্টি আকর্ষণ করবে।


4
জাভা 7 এখন তাই জাভা 7 এ এটি কীভাবে করা যায় তার একটি উদাহরণ সহায়ক হবে। বা কমপক্ষে একটি লিঙ্ক। অথবা গুগলে অনুসন্ধান করার জন্য একটি শ্রেণীর নাম। - এটি «স্ট্যাকওভারফ্লো» এবং সর্বোপরি «তাত্ত্বিক সিএস। নয় ;-)।
মার্টিন

4
ভালভাবে দেখা যাক ... আমার আসল পোস্টটি ২০১০ সালের মার্চ মাসে ছিল ... এটি এখন জানুয়ারী ২০১২ ... এবং আমি কেবল আমার সরঞ্জামের ইতিহাসের ইতিহাসটি পরীক্ষা করে দেখেছি, আর আমি নিজেকে মার্চ '10 এ কোনও টাইম মেশিন রেখে দেখছি না, সুতরাং আমি মনে করি আমি স্পষ্ট উদাহরণ না দিয়ে উত্তর দেওয়ার ক্ষেত্রে ন্যায়সঙ্গত হতে পারি ;-)
কেভিন ডে


7

এটি ঠিক কাজ করবে ... এবং এর পুনরাবৃত্তি

File root = new File("ROOT PATH");
for ( File file : root.listFiles())
{
    getFilesRecursive(file);
}


private static void getFilesRecursive(File pFile)
{
    for(File files : pFile.listFiles())
    {
        if(files.isDirectory())
        {
            getFilesRecursive(files);
        }
        else
        {
            // do your thing 
            // you can either save in HashMap and use it as
            // per your requirement
        }
    }
}

4
জাভা <7 নিয়ে কাজ করে এমন কিছু চাইলে ভাল উত্তর।
ssimm

3

আমি ব্যক্তিগতভাবে ফাইল ইউটিলসের এই সংস্করণটি পছন্দ করি। এখানে একটি উদাহরণ যা ডিরেক্টরি বা এর যে কোনও উপ-ডিরেক্টরিতে সমস্ত এমপি 3 বা ফ্ল্যাক খুঁজে পায়:

String[] types = {"mp3", "flac"};
Collection<File> files2 = FileUtils.listFiles(/path/to/your/dir, types , true);

3

এটি ভাল কাজ করবে

public void displayAll(File path){      
    if(path.isFile()){
        System.out.println(path.getName());
    }else{
        System.out.println(path.getName());         
        File files[] = path.listFiles();
        for(File dirOrFile: files){
            displayAll(dirOrFile);
        }
    }
}


স্ট্যাকওভারফ্লো মামের স্বাগতম, আপনি কি উত্তর দিতে পারবেন যে বিদ্যমান উত্তরগুলির উন্নতি বা বিকল্প কীভাবে?
লিলিয়ানথাল

1

এই ফাংশনটি সম্ভবত সমস্ত ফাইলের নাম এবং এর ডিরেক্টরি এবং এর উপ ডিরেক্টরিগুলি থেকে তার পাথ তালিকাভুক্ত করবে।

public void listFile(String pathname) {
    File f = new File(pathname);
    File[] listfiles = f.listFiles();
    for (int i = 0; i < listfiles.length; i++) {
        if (listfiles[i].isDirectory()) {
            File[] internalFile = listfiles[i].listFiles();
            for (int j = 0; j < internalFile.length; j++) {
                System.out.println(internalFile[j]);
                if (internalFile[j].isDirectory()) {
                    String name = internalFile[j].getAbsolutePath();
                    listFile(name);
                }

            }
        } else {
            System.out.println(listfiles[i]);
        }

    }

}

4
এই উদাহরণটি তালিকাগুলি () পদ্ধতিটি বাতিল করতে পারে এবং করতে পারে এই বিষয়টি বিবেচনায় নেই। docs.oracle.com/javase/7/docs/api/java/io/File.html#listFiles ()
ম্যাট জোনস

1

জাভা 8

public static void main(String[] args) throws IOException {

        Path start = Paths.get("C:\\data\\");
        try (Stream<Path> stream = Files.walk(start, Integer.MAX_VALUE)) {
            List<String> collect = stream
                .map(String::valueOf)
                .sorted()
                .collect(Collectors.toList());

            collect.forEach(System.out::println);
        }


    }

0

মনে হচ্ছে এটি বোকা ফাইল সিস্টেমে অ্যাক্সেস করে এবং একবারে সবকিছু পাওয়ার পরিবর্তে প্রতিটি উপ-ডিরেক্টরিতে সামগ্রীগুলি পায় get

আপনার অনুভূতি ভুল ফাইল সিস্টেমগুলি এভাবেই কাজ করে। এর চেয়ে দ্রুত কোনও উপায় নেই (আপনি যখন বারবার বা বিভিন্ন ধরণের জন্য এটি করতেই পারেন তখন সমস্ত ফাইল পাথ মেমোরিতে ক্যাশে করতে পারেন তবে আপনাকে ক্যাশে অবৈধতার সাথে মোকাবিলা করতে হবে অর্থাৎ ফাইলগুলি যুক্ত / সরানো / পুনরায় নামকরণের সময় কী ঘটবে? অ্যাপটি চালিত হয়)।


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

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

সম্ভবত আপনি কিছু সূচি ফাইল তৈরি করতে পারেন। ডিরেক্টরি আকার যাচাই করার উপায় আছে যদি আকার পরিবর্তন হয় আপনি কেবল নতুন ফাইল জন্য স্ক্যান করতে পারেন।
জেমস পি।

@ জেমস: ডিরেক্টরি আকার চেক করার কোনও উপায় নেই। আমি যে সমস্ত ফাইল সিস্টেমে সচেতন সেগুলিতে প্রতিটি ফাইলের আকার পেয়ে এবং সেগুলি যুক্ত করে একটি ডিরেক্টরি আকারের আকার গ্রহণ করা হয়। আসলে, প্রশ্ন "এই ডিরেক্টরিটির আকার কী?" এমনকি আপনি যদি হার্ডলিঙ্কগুলি বিবেচনা করেন তবে এগুলি মোটেই বোঝা যায় না।
মাইকেল বর্গওয়ার্ট

তুমি ঠিক বলছো. আমি এখনও অনুভব করি যে কিছু ক্যাচিং এবং / অথবা আঙুলের ছাপ প্রক্রিয়াটিকে গতিময় করতে পারে।
জেমস পি।

0

ঠিক তাই আপনি জানেন যে ডিরেক্টরী () বেশ ধীর পদ্ধতি। আমি আমার ফাইল ব্রাউজারে এটি বেশ ধীর পাচ্ছি। আমি একটি লাইব্রেরি নেটিভ কোড সঙ্গে এটি প্রতিস্থাপন সন্ধান করা হবে।


0

কয়েক মিলিয়ন ফোল্ডার এবং ফাইলগুলির সাথে ডিল করার ক্ষেত্রে আমি যে আরও কার্যকর উপায়টি পেয়েছি সেটি হ'ল কিছু ফাইলের ডস কমান্ডের মাধ্যমে ডিরেক্টরি তালিকা ক্যাপচার করা এবং এটি পার্স করা। আপনার একবার ডেটা পার্স করার পরে আপনি বিশ্লেষণ এবং গণনা পরিসংখ্যান করতে পারেন।


0
import java.io.*;

public class MultiFolderReading {

public void checkNoOfFiles (String filename) throws IOException {

    File dir=new File(filename);
    File files[]=dir.listFiles();//files array stores the list of files

 for(int i=0;i<files.length;i++)
    {
        if(files[i].isFile()) //check whether files[i] is file or directory
        {
            System.out.println("File::"+files[i].getName());
            System.out.println();

        }
        else if(files[i].isDirectory())
        {
            System.out.println("Directory::"+files[i].getName());
            System.out.println();
            checkNoOfFiles(files[i].getAbsolutePath());
        }
    }
}

public static void main(String[] args) throws IOException {

    MultiFolderReading mf=new MultiFolderReading();
    String str="E:\\file"; 
    mf.checkNoOfFiles(str);
   }
}

দয়া করে কিছু ব্যাখ্যাও যুক্ত করুন।
d4Rk

0

পেয়ারাতে আপনাকে কোনও সংগ্রহ ফিরে পাওয়ার জন্য অপেক্ষা করতে হবে না তবে প্রকৃতপক্ষে ফাইলগুলি পুনরাবৃত্তি করতে পারে। IDoSomethingWithThisFileনীচের ফাংশনের স্বাক্ষরে একটি ইন্টারফেসটি কল্পনা করা সহজ :

public static void collectFilesInDir(File dir) {
    TreeTraverser<File> traverser = Files.fileTreeTraverser();
    FluentIterable<File> filesInPostOrder = traverser.preOrderTraversal(dir);
    for (File f: filesInPostOrder)
        System.out.printf("File: %s\n", f.getPath());
}

TreeTraverser আপনাকে বিভিন্ন ট্র্যাভারসাল শৈলীর মধ্যেও অনুমতি দেয়।


0
public class GetFilesRecursive {
    public static List <String> getFilesRecursively(File dir){
        List <String> ls = new ArrayList<String>();
        for (File fObj : dir.listFiles()) {
            if(fObj.isDirectory()) {
                ls.add(String.valueOf(fObj));
                ls.addAll(getFilesRecursively(fObj));               
            } else {
                ls.add(String.valueOf(fObj));       
            }
        }

        return ls;
    }
    public static List <String> getListOfFiles(String fullPathDir) {
        List <String> ls = new ArrayList<String> ();
        File f = new File(fullPathDir);
        if (f.exists()) {
            if(f.isDirectory()) {
                ls.add(String.valueOf(f));
                ls.addAll(getFilesRecursively(f));
            }
        } else {
            ls.add(fullPathDir);
        }
        return ls;
    }

    public static void main(String[] args) {
        List <String> ls = getListOfFiles("/Users/srinivasab/Documents");
        for (String file:ls) {
            System.out.println(file);
        }
        System.out.println(ls.size());
    }
}

0

আর একটি অপ্টিমাইজড কোড

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class GetFilesRecursive {
    public static List <String> getFilesRecursively(File dir){
        List <String> ls = new ArrayList<String>();
        if (dir.isDirectory())
            for (File fObj : dir.listFiles()) {
                if(fObj.isDirectory()) {
                    ls.add(String.valueOf(fObj));
                    ls.addAll(getFilesRecursively(fObj));               
                } else {
                    ls.add(String.valueOf(fObj));       
                }
            }
        else
            ls.add(String.valueOf(dir));

        return ls;
    }

    public static void main(String[] args) {
        List <String> ls = getFilesRecursively(new File("/Users/srinivasab/Documents"));
        for (String file:ls) {
            System.out.println(file);
        }
        System.out.println(ls.size());
    }
}

দয়া করে, আপনি আরও বিস্তারিত ব্যাখ্যা দিয়ে আপনার উত্তরটি প্রসারিত করতে পারেন? এটি বোঝার জন্য খুব দরকারী হবে। ধন্যবাদ!
vezunchik

0

জাভা 8 ব্যবহার করে ফাইল এবং ডিরেক্টরি তালিকাভুক্ত করার আরও একটি উদাহরণ filter

public static void main(String[] args) {

System.out.println("Files!!");
        try {
            Files.walk(Paths.get("."))
                    .filter(Files::isRegularFile)
                    .filter(c ->
                            c.getFileName().toString().substring(c.getFileName().toString().length()-4).contains(".jpg")
                            ||
                            c.getFileName().toString().substring(c.getFileName().toString().length()-5).contains(".jpeg")
                    )
                    .forEach(System.out::println);

        } catch (IOException e) {
        System.out.println("No jpeg or jpg files");
        }

        System.out.println("\nDirectories!!\n");
        try {
            Files.walk(Paths.get("."))
                    .filter(Files::isDirectory)
                    .forEach(System.out::println);

        } catch (IOException e) {
            System.out.println("No Jpeg files");
        }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.