ডিরেক্টরিতে সমস্ত ফাইল মুছুন (তবে ডিরেক্টরি নয়) - একটি লাইনারের সমাধান


201

আমি এবিসি ডিরেক্টরিতে সমস্ত ফাইল মুছতে চাই।

যখন আমি FileUtils.deleteDirectory(new File("C:/test/ABC/"));এটির চেষ্টা করেছি তখন এটিসি ফোল্ডারটিও মুছে ফেলা হয়।

এমন কোনও লাইনারের সমাধান আছে যেখানে আমি ডিরেক্টরিতে নয় তবে ডিরেক্টরিতে থাকা ফাইলগুলি মুছতে পারি?


2
Thats কারণ .deleteDirectory (এমনকি নাম এটি বোঝায়) ডিরেক্টরি মুছে ফেলার জন্য ব্যবহৃত হয়। ফাইলটি ডিরেক্টরি না থাকলে এটি এতে যে ডিরেক্টরিটি রয়েছে তা পেয়ে যাবে।
ব্যবহারকারী 1534664

ডিরেক্টরি ফাইলের পরিবর্তে ফাইলগুলি মুছতে পারে এমন ফাইল ইউটিলেস শ্রেণীর ভিতরে অন্যান্য ক্রিয়াকলাপ অনুসন্ধান করার চেষ্টা করুন।
ব্যবহারকারী 1534664


1
কেন আপনার বিশেষভাবে ওয়ান-লাইনার দরকার? পারফরম্যান্স মানদণ্ড হতে পারে না, কারণ কোনও তৃতীয় পক্ষের লাইব্রেরি পদ্ধতিটি কেবল পুনরাবৃত্তভাবে তা করবে। সুতরাং এটি আপনাকে একই পারফরম্যান্স দিতে হবে?
রোহিত জৈন 13

1
আপনি যা করতে পারেন তা হ'ল ডিরেক্টরি মুছুন এবং তারপরে এটি পুনরায় তৈরি করুন। আমরা দেখেছি যে ব্যবহার rm -rf directory; mkdir directoryকরা ব্যবহারের চেয়ে দ্রুত ছিল FileUtils.cleanDirectory
জোশুয়া পিন্টার 18

উত্তর:


362
import org.apache.commons.io.FileUtils;

FileUtils.cleanDirectory(directory); 

একই পদ্ধতিতে এই পদ্ধতিটি উপলব্ধ। এটি পুনরাবৃত্তভাবে তাদের অধীন সমস্ত সাব-ফোল্ডার এবং ফাইলগুলি মুছে ফেলবে।

দস্তাবেজ: org.apache.commons.io.FileUtils.cleanDirectory


49
এক ভাল, এছাড়াও মানুষ এই চেহারা থেকে প্রতিরোধ করতে; এখানে আমদানি: org.apache.commons.io.FileUtils আমদানি করুন;
পল গ্রেগোয়ার

5
আমদানিটি কেন খুঁজে পাওয়া যায় না তা আমার এখনও অনুসন্ধান করতে হবে। এটি এ্যাপাএইচআরএক্স থেকে অবশ্যই ডাউনলোড করতে হবে ।
টোমা জ্যাটো - মনিকা

সুন্দর সমাধান। গ্রেডের মাধ্যমে এই লাইবটি পরীক্ষা করুন: "কমন্স-আইও: কমন্স-আইও: +" সংকলন করুন
লিও এনগুইন

1
গ্রেডল নির্ভরতা - সংকলন গ্রুপ: 'কমন্স-আইও', নাম: 'কমন্স-আইও', সংস্করণ: '2.5'।
জয়দেব

দ্রষ্টব্য, আমরা দেখতে পেয়েছি যে কলিং rm -rf directoryব্যবহারের চেয়ে অনেক বেশি দক্ষ ছিল FileUtils.cleanDirectory
জোশুয়া পিন্টার

267

আপনি কি মানে?

for(File file: dir.listFiles()) 
    if (!file.isDirectory()) 
        file.delete();

এটি কেবল ফাইলগুলি মুছবে, ডিরেক্টরিগুলি নয়।


65
এটি একটি আরও ভাল উত্তর, কারণ এটি একটি বাহ্যিক lib ব্যবহার করে না!
অ্যালেক্সওয়েন

10
@ তবে তবে তারপরেও: যখন একটি মানক পদ্ধতি থাকে তখন সেখানে কোনও বহিরাগত ব্যবহার করার কোনও কারণ নেই যা একই কাজ করে। একদিন তিনি লিব থেকে মুক্তি পেতে চাইতে পারেন, বা লাইবটি আর সমর্থিত নয়, বা লাইসেন্স কারণে ইত্যাদির জন্য এই লাইবটি ব্যবহার করার অনুমতি নেই, ইত্যাদি। (এই সমস্ত এই নির্দিষ্ট লিবার জন্য কোনও সমস্যা নাও হতে পারে, তবে প্রযোজ্য অন্যান্য অনেকগুলি)
অ্যালেক্সওয়েন

10
রুট "dir" ডিরেক্টরিতে ডিরেক্টরি অন্তর্ভুক্ত থাকলে এটি সবকিছু মুছে ফেলতে ব্যর্থ হবে।
টিয়াগো

2
@ টিয়াগোটি সত্য, এটি খালি নয় এমন সাব-ডিরেক্টরিগুলি মুছবে না।
পিটার লরি

4
for(File file: dir.listFiles())সম্ভবত হিসাবে বোঝানো .... for (File file : new java.io.File("C:\\DeleteMeFolder").listFiles())....
হার্টমুট পি

62

পিটার লরির উত্তর দুর্দান্ত কারণ এটি সাধারণ এবং বিশেষ কোনও কিছুর উপর নির্ভর করে না এবং এটি আপনার করা উচিত। আপনার যদি এমন কিছু প্রয়োজন হয় যা উপ-ডিরেক্টরিগুলি এবং তাদের সামগ্রীগুলিও সরিয়ে দেয় তবে পুনরাবৃত্তিটি ব্যবহার করুন:

void purgeDirectory(File dir) {
    for (File file: dir.listFiles()) {
        if (file.isDirectory())
            purgeDirectory(file);
        file.delete();
    }
}

সাব-ডাইরেক্টরিগুলি এবং সেগুলির বিষয়বস্তুগুলি (আপনার প্রশ্নের অংশ) বাঁচাতে, নীচের মত পরিবর্তন করুন:

void purgeDirectoryButKeepSubDirectories(File dir) {
    for (File file: dir.listFiles()) {
        if (!file.isDirectory())
            file.delete();
    }
}

বা, যেহেতু আপনি এক-লাইন সমাধান চেয়েছিলেন:

for (File file: dir.listFiles())
    if (!file.isDirectory())
        file.delete();

এই ধরনের তুচ্ছ কাজের জন্য বাহ্যিক গ্রন্থাগার ব্যবহার করা ভাল ধারণা নয় যদি না আপনার যেকোনো কিছুর জন্য এই লাইব্রেরিটির প্রয়োজন হয়, সেক্ষেত্রে বিদ্যমান কোডটি ব্যবহার করা পছন্দনীয়। আপনি আপাকে লাইব্রেরি যেভাবেই ব্যবহার করছেন বলে মনে হয় তাই এর FileUtils.cleanDirectory()পদ্ধতিটি ব্যবহার করুন ।


1
অন্যদিকে, যদি কেউ বাহ্যিক গ্রন্থাগারটি প্রথম ব্যবহার করে না, তবে অন্যরা বাহ্যিক গ্রন্থাগারে একই রকম আচরণের প্রত্যাশা করবে এবং তারা সেখানে দেখবে এমন সম্ভাবনা কম থাকবে ... আমাদের যথেষ্ট নেই এখানে কি আবিষ্কার করা হয়নি? লাইব্রেরিটি যদি আমার প্রকল্পে যুক্ত থাকে এবং সহজ হয় তবে আমি প্রায় সবসময় লাইব্রেরি যুক্ত করতে পছন্দ করি।
জেবি রেইনসবার্গার

33

জাভা 8 স্ট্রিম

এটি কেবলমাত্র এবিসি থেকে ফাইলগুলি মুছে দেয় (উপ-ডিরেক্টরিগুলি আউটচুড রয়েছে):

Arrays.stream(new File("C:/test/ABC/").listFiles()).forEach(File::delete);

এটি কেবলমাত্র এবিসি (এবং উপ ডিরেক্টরি) থেকে ফাইলগুলি মুছবে :

Files.walk(Paths.get("C:/test/ABC/"))
                .filter(Files::isRegularFile)
                .map(Path::toFile)
                .forEach(File::delete);

Version এই সংস্করণটির আইওএক্সেপশন হ্যান্ডলিং করা দরকার


1
দ্বিতীয়টি উপ-ডিরেক্টরিগুলি (পরীক্ষিত) মুছবে না
এডওয়াইজ

1
@ ইডওয়াইস হ্যাঁ, এটি এবিসি থেকে সমস্ত ফাইল এবং উপ-ডিরেক্টরি থেকে সমস্ত ফাইল মুছবে। ইংরেজরা একটু দ্বিধাবিভক্ত।
ননলাইনফর্ট

11

বা জাভা 8 এ এটি ব্যবহার করতে:

try {
  Files.newDirectoryStream( directory ).forEach( file -> {
    try { Files.delete( file ); }
    catch ( IOException e ) { throw new UncheckedIOException(e); }
  } );
}
catch ( IOException e ) {
  e.printStackTrace();
}

এটি অত্যন্ত দুঃখের বিষয় যে ব্যতিক্রম হ্যান্ডলিং এতটাই বিশাল, অন্যথায় এটি ওয়ান-লাইনার হবে ...


আপনি কিভাবে জানেন যে ফাইল না IS আসলে এবং না একটি ডিরেক্টরি একটি ফাইল?
স্টিফান

1
এটি ডিরেক্টরি
মার্কস

5
public class DeleteFile {
    public static void main(String[] args) {
        String path="D:\test"; 
        File file = new File(path);
        File[] files = file.listFiles(); 
        for (File f:files) 
        {if (f.isFile() && f.exists) 
            { f.delete();
system.out.println("successfully deleted");
            }else{
system.out.println("cant delete a file due to open or error");
} }  }}

2

অন্য একটি জাভা 8 স্ট্রিম সমাধান কোনও ফোল্ডারের সমস্ত সামগ্রী মুছে ফেলার জন্য, সাব ডিরেক্টরি অন্তর্ভুক্ত করা হয়েছে, তবে ফোল্ডারটি নিজেই নয়।

ব্যবহার:

Path folder = Paths.get("/tmp/folder");
CleanFolder.clean(folder);

এবং কোড:

public interface CleanFolder {
    static void clean(Path folder) throws IOException {

        Function<Path, Stream<Path>> walk = p -> {
            try { return Files.walk(p);
        } catch (IOException e) {
            return Stream.empty();
        }};

        Consumer<Path> delete = p -> {
            try {
                Files.delete(p);
            } catch (IOException e) {
            }
        };

        Files.list(folder)
            .flatMap(walk)
            .sorted(Comparator.reverseOrder())
            .forEach(delete);
    }
}

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

আমি একটি সমাধান তৈরি করার চেষ্টা করেছি যা যতটা সম্ভব সংক্ষিপ্ত।


বরং তারপরে ওয়াক ফাংশনে একটি নাল ফিরিয়ে দেওয়া খালি স্ট্রিম (স্ট্রিম.এম্পটি ()) ফেরত দেওয়া ভাল। এটি পরিষ্কার এবং ফাংশন সর্বদা একটি স্ট্রিম ফিরিয়ে দেয়। সম্ভব হলে নাল এড়ানো উচিত।
কাবা 713

ধন্যবাদ, আমি আপনার পরামর্শ দিয়ে উত্তরটির উন্নতি করেছি
হাইজ্যাক

2

ডিরেক্টরি থেকে সমস্ত ফাইল মোছার জন্য "সি: \ উদাহরণ" বলুন

File file = new File("C:\\Example");      
String[] myFiles;    
if (file.isDirectory()) {
    myFiles = file.list();
    for (int i = 0; i < myFiles.length; i++) {
        File myFile = new File(file, myFiles[i]); 
        myFile.delete();
    }
}

2

rm -rfচেয়ে অনেক বেশি পারফরম্যান্ট ছিল FileUtils.cleanDirectory

ওয়ান-লাইনারের সমাধান নয়, বিস্তৃত বেঞ্চমার্কিংয়ের পরে, আমরা দেখতে পেয়েছি যে ব্যবহারটি ব্যবহারের rm -rfচেয়ে বহুগুণ বেশি দ্রুত ছিল FileUtils.cleanDirectory

অবশ্যই, আপনার যদি একটি ছোট বা সাধারণ ডিরেক্টরি থাকে তবে এটি কোনও ব্যাপার নয় তবে আমাদের ক্ষেত্রে আমাদের একাধিক গিগাবাটি এবং গভীরভাবে নেস্টেড সাব ডিরেক্টরি রয়েছে যেখানে এটি 10 ​​মিনিটের সাথে FileUtils.cleanDirectoryএবং কেবল 1 মিনিটের সাথে লাগবে rm -rf

এটি করার জন্য এখানে আমাদের রুক্ষ জাভা বাস্তবায়ন:

// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean clearDirectory( File file ) throws IOException, InterruptedException {

    if ( file.exists() ) {

        String deleteCommand = "rm -rf " + file.getAbsolutePath();
        Runtime runtime = Runtime.getRuntime();

        Process process = runtime.exec( deleteCommand );
        process.waitFor();

        file.mkdirs(); // Since we only want to clear the directory and not delete it, we need to re-create the directory.

        return true;
    }

    return false;

}

আপনি বড় বা জটিল ডিরেক্টরি নিয়ে কাজ করছেন যদি চেষ্টা করা মূল্যবান।


1
package com;
import java.io.File;
public class Delete {
    public static void main(String[] args) {

        String files; 
        File file = new File("D:\\del\\yc\\gh");
        File[] listOfFiles = file.listFiles(); 
        for (int i = 0; i < listOfFiles.length; i++) 
        {
            if (listOfFiles[i].isFile()) 
            {
                files = listOfFiles[i].getName();
                System.out.println(files);
                if(!files.equalsIgnoreCase("Scan.pdf"))
                {
                    boolean issuccess=new File(listOfFiles[i].toString()).delete();
                    System.err.println("Deletion Success "+issuccess);
                }
            }
        }
    }
}

আপনি যদি সমস্ত ফাইল মুছতে চান তবে মুছে ফেলুন

if(!files.equalsIgnoreCase("Scan.pdf"))

বিবৃতি এটি কাজ করবে।


0

আমি মনে করি এটি কাজ করবে (ননলাইনারফ্রুট পূর্ববর্তী উত্তরের ভিত্তিতে):

Files.walk(Paths.get("C:/test/ABC/"))
                .sorted(Comparator.reverseOrder())
                .map(Path::toFile)
                .filter(item -> !item.getPath().equals("C:/test/ABC/"))
                .forEach(File::delete);

চিয়ার্স!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.