জাভাতে পুনরুক্তি দিয়ে পুরো ডিরেক্টরি মুছে ফেলার কোনও উপায় আছে কি?
সাধারণ ক্ষেত্রে খালি ডিরেক্টরি মুছে ফেলা সম্ভব। তবে যখন বিষয়বস্তু সহ পুরো ডিরেক্টরি মুছে ফেলা যায়, এটি আর এত সহজ নয়।
আপনি জাভাতে সামগ্রিক ডিরেক্টরিগুলি কীভাবে মুছবেন?
জাভাতে পুনরুক্তি দিয়ে পুরো ডিরেক্টরি মুছে ফেলার কোনও উপায় আছে কি?
সাধারণ ক্ষেত্রে খালি ডিরেক্টরি মুছে ফেলা সম্ভব। তবে যখন বিষয়বস্তু সহ পুরো ডিরেক্টরি মুছে ফেলা যায়, এটি আর এত সহজ নয়।
আপনি জাভাতে সামগ্রিক ডিরেক্টরিগুলি কীভাবে মুছবেন?
উত্তর:
আপনার অ্যাপাচি এর কমন্স-আইও পরীক্ষা করা উচিত । এটির একটি ফাইলUtils ক্লাস রয়েছে যা আপনি যা চান তা করবে।
FileUtils.deleteDirectory(new File("directory"));
জাভা 7 এর সাহায্যে আমরা শেষ পর্যন্ত এটি নির্ভরযোগ্য সিমেলিংক সনাক্তকরণের মাধ্যমে করতে পারি। ( এই মুহুর্তে আমি অ্যাপাচি-এর কমন্স-আইওকে নির্ভরযোগ্য সিমলিংক সনাক্তকরণ হিসাবে বিবেচনা করি না, কারণ এটি উইন্ডোজে তৈরি হওয়া লিঙ্কগুলি পরিচালনা করে না mklink
।)
ইতিহাসের স্বার্থে, এখানে একটি পূর্ব-জাভা 7 উত্তর রয়েছে, যা সিমলিঙ্কগুলি অনুসরণ করে।
void delete(File f) throws IOException {
if (f.isDirectory()) {
for (File c : f.listFiles())
delete(c);
}
if (!f.delete())
throw new FileNotFoundException("Failed to delete file: " + f);
}
foo
একটি লিঙ্ক সহ foo/link
যেমন যে link->/
কলিং, delete(new File(foo))
আপনার ফাইল সিস্টেম এর যতটা মুছে ফেলবে যেমন আপনার ব্যবহারকারী অনুমোদিত হয় !!
জাভা 7+ এ আপনি Files
ক্লাস ব্যবহার করতে পারেন । কোড খুব সহজ:
Path directory = Paths.get("/tmp");
Files.walkFileTree(directory, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
super.postVisitDirectory(dir, exc);
আপনার postVisitDirectory
পদ্ধতিতে কল করা উচিত , যদি হাঁটার কোনও ডিরেক্টরি তালিকাভুক্ত না করতে পারে blow
ওয়ান-লাইনার সলিউশন (জাভা 8) সমস্ত ফাইল এবং ডিরেক্টরি মুছে ফেলার জন্য পুনরাবৃত্তভাবে ডিরেক্টরি শুরু করে:
Files.walk(Paths.get("c:/dir_to_delete/"))
.map(Path::toFile)
.sorted((o1, o2) -> -o1.compareTo(o2))
.forEach(File::delete);
আমরা বিপরীত ক্রমের জন্য একটি তুলনামূলক ব্যবহার করি, অন্যথায় ফাইল :: মুছুন সম্ভবত শূন্যস্থান ডিরেক্টরি মুছে ফেলতে সক্ষম হবে না। সুতরাং, আপনি যদি ডিরেক্টরিগুলি রাখতে চান এবং কেবল ফাইলগুলি মুছতে চান তবে কেবল বাছাই করা () অনুসারে তুলনামূলক অপসারণ করুন বা সম্পূর্ণ বাছাই করা সরান এবং ফাইলগুলি ফিল্টার যুক্ত করুন:
Files.walk(Paths.get("c:/dir_to_delete/"))
.filter(Files::isRegularFile)
.map(Path::toFile)
.forEach(File::delete);
.sorted(Comparator.reverseOrder())
প্রস্তাবটি কাজ Comparator::reverseOrder
করে না । দেখুন: stackoverflow.com/questions/43036611/...
.sorted((f1, f2) -> f2.compareTo(f1))
, তুলনা f2
সঙ্গে f1
পরিবর্তে f1
সঙ্গে f2
।
জাভা 7 সিমিলিংক হ্যান্ডলিং সহ ডিরেক্টরিগুলি হাঁটার জন্য যোগ করেছে:
import java.nio.file.*;
public static void removeRecursive(Path path) throws IOException
{
Files.walkFileTree(path, new SimpleFileVisitor<Path>()
{
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
throws IOException
{
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
{
// try to delete the file anyway, even if its attributes
// could not be read, since delete-only access is
// theoretically possible
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException
{
if (exc == null)
{
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
else
{
// directory iteration failed; propagate exception
throw exc;
}
}
});
}
আমি এটিকে প্ল্যাটফর্ম-নির্দিষ্ট পদ্ধতিগুলি থেকে ফ্যালব্যাক হিসাবে ব্যবহার করি (এই পরীক্ষিত কোডটিতে ):
public static void removeDirectory(Path directory) throws IOException
{
// does nothing if non-existent
if (Files.exists(directory))
{
try
{
// prefer OS-dependent directory removal tool
if (SystemUtils.IS_OS_WINDOWS)
Processes.execute("%ComSpec%", "/C", "RD /S /Q \"" + directory + '"');
else if (SystemUtils.IS_OS_UNIX)
Processes.execute("/bin/rm", "-rf", directory.toString());
}
catch (ProcessExecutionException | InterruptedException e)
{
// fallback to internal implementation on error
}
if (Files.exists(directory))
removeRecursive(directory);
}
}
(সিস্টেম ইউটিগুলি অ্যাপাচি কমন্স ল্যাং থেকে । প্রক্রিয়াগুলি ব্যক্তিগত তবে এর আচরণটি সুস্পষ্ট হওয়া উচিত))
কেবলমাত্র দেখেছে আমার সমাধানটি কমবেশি এরিকসনের মতোই, কেবল একটি স্থির পদ্ধতি হিসাবে প্যাকেজড। এটিকে কোথাও ফেলে দিন, এটি অ্যাপাচি কমন্সের সমস্ত কিছুর জন্য ইনস্টল করার চেয়ে অনেক হালকা ওজন (যা আপনি দেখতে পাচ্ছেন) বেশ সহজ।
public class FileUtils {
/**
* By default File#delete fails for non-empty directories, it works like "rm".
* We need something a little more brutual - this does the equivalent of "rm -r"
* @param path Root File Path
* @return true iff the file and all sub files/directories have been removed
* @throws FileNotFoundException
*/
public static boolean deleteRecursive(File path) throws FileNotFoundException{
if (!path.exists()) throw new FileNotFoundException(path.getAbsolutePath());
boolean ret = true;
if (path.isDirectory()){
for (File f : path.listFiles()){
ret = ret && deleteRecursive(f);
}
}
return ret && path.delete();
}
}
স্ট্যাক সহ এবং পুনরাবৃত্তির পদ্ধতি ছাড়াই একটি সমাধান:
File dir = new File("/path/to/dir");
File[] currList;
Stack<File> stack = new Stack<File>();
stack.push(dir);
while (! stack.isEmpty()) {
if (stack.lastElement().isDirectory()) {
currList = stack.lastElement().listFiles();
if (currList.length > 0) {
for (File curr: currList) {
stack.push(curr);
}
} else {
stack.pop().delete();
}
} else {
stack.pop().delete();
}
}
list*
ক্লাসের জন্য পদ্ধতিগুলি সম্পর্কে সতর্কতা অবলম্বন করুন java.io.File
। জাভাডোকস থেকে: "যদি এই বিমূর্ত পথের নামটি ডিরেক্টরিকে বোঝায় না বা আই / ও ত্রুটি দেখা দেয় তবে নালটি ফিরে আসে।" সুতরাং: if (currList.length > 0) {
হয়ে যায়if (null != currList && currList.length > 0) {
আপনি Spring থাকে, তাহলে আপনি ব্যবহার করতে পারেন FileSystemUtils.deleteRecursively :
import org.springframework.util.FileSystemUtils;
boolean success = FileSystemUtils.deleteRecursively(new File("directory"));
পেয়ারা 9Files.deleteRecursively(File)
পর্যন্ত পেয়ারা সমর্থন করেছিল ।
পেয়ারা 10 থেকে :
অননুমোদিত। এই পদ্ধতিটি দুর্বল সিমলিংক সনাক্তকরণ এবং জাতি অবস্থার সাথে ভুগছে। এই বৈশিষ্ট্য শুধুমাত্র যেমন একটি অপারেটিং সিস্টেমের কমান্ড আউট shelling দ্বারা উপযুক্ত সমর্থিত হতে পারে
rm -rf
বাdel /s
। এই পদ্ধতিটি পেয়ারা থেকে গুয়ারা রিলিজ 11.0 এ মুছে ফেলার কথা।
সুতরাং, পেয়ারা 11 এ জাতীয় কোনও পদ্ধতি নেই ।
for(Path p : Files.walk(directoryToDelete).
sorted((a, b) -> b.compareTo(a)). // reverse; files before dirs
toArray(Path[]::new))
{
Files.delete(p);
}
অথবা আপনি যদি পরিচালনা করতে চান IOException
:
Files.walk(directoryToDelete).
sorted((a, b) -> b.compareTo(a)). // reverse; files before dirs
forEach(p -> {
try { Files.delete(p); }
catch(IOException e) { /* ... */ }
});
Files.walk(path).iterator().toSeq.reverse.foreach(Files.delete)
walk
পদ্ধতি ইতিমধ্যে গভীরতা প্রথম ট্র্যাভেরসাল গ্যারান্টী বা নিশ্চয়তা দিচ্ছে।
Collections.reverseOrder()
তাই আপনার কোড for (Path p : Files.walk(directoryToDelete).sorted(reverseOrder()).toArray(Path[]::new))
ধরে নেওয়া হবে যে এটি স্থিতিশীলভাবে আমদানি করা হয়েছে।
Comparator.reverseOrder
? Files.walk(dir) .sorted(Comparator.reverseOrder()) .toArray(Path[]::new))
public void deleteRecursive(File path){
File[] c = path.listFiles();
System.out.println("Cleaning out folder:" + path.toString());
for (File file : c){
if (file.isDirectory()){
System.out.println("Deleting file:" + file.toString());
deleteRecursive(file);
file.delete();
} else {
file.delete();
}
}
path.delete();
}
static public void deleteDirectory(File path)
{
if (path == null)
return;
if (path.exists())
{
for(File f : path.listFiles())
{
if(f.isDirectory())
{
deleteDirectory(f);
f.delete();
}
else
{
f.delete();
}
}
path.delete();
}
}
f.delete()
অধীনে deleteDirectory(f)
ইচ্ছা NoSuchFileException ছোঁড়ার কারণ deleteDirectory(f)
ইতিমধ্যে যে ফাইল মুছে দিন। প্রতিটি ডিরেক্টরি একটি পাসে পরিণত হবে deleteDirectory(f)
এবং এর মাধ্যমে মুছে ফেলা হবে path.delete()
। অতএব, আমাদের দরকার নেই f.delete()
এ if f.isDerectory
অধ্যায়। সুতরাং, কেবল মুছে ফেলুন মুছে ফেলুন ডিরেক্টরি এর f.delete();
অধীনে (চ) এবং এটি কার্যকর হবে।
সিমলিংক এবং উপরের কোডটি দিয়ে ব্যর্থ হওয়ার দুটি উপায় ... এবং সমাধানটি জানেন না।
একটি পরীক্ষা তৈরি করতে এটি চালান:
echo test > testfile
mkdir dirtodelete
ln -s badlink dirtodelete/badlinktodelete
এখানে আপনি আপনার পরীক্ষার ফাইল এবং পরীক্ষা ডিরেক্টরিটি দেখুন:
$ ls testfile dirtodelete
testfile
dirtodelete:
linktodelete
তারপরে আপনার কমন্স-আইও ডিলিট ডিরেক্টরি () চালান। ফাইলটি খুঁজে পাওয়া যায়নি বলে এটি ক্রাশ করে। অন্যান্য উদাহরণগুলি এখানে কী করে তা নিশ্চিত নয়। লিনাক্স আরএম কমান্ডটি কেবল লিঙ্কটি মুছে ফেলত, এবং ডিরেক্টরিতে rm -rও করে দেয়।
Exception in thread "main" java.io.FileNotFoundException: File does not exist: /tmp/dirtodelete/linktodelete
একটি পরীক্ষা তৈরি করতে এটি চালান:
mkdir testdir
echo test > testdir/testfile
mkdir dirtodelete
ln -s ../testdir dirtodelete/dirlinktodelete
এখানে আপনি আপনার পরীক্ষার ফাইল এবং পরীক্ষা ডিরেক্টরিটি দেখুন:
$ ls dirtodelete testdir
dirtodelete:
dirlinktodelete
testdir:
testfile
তারপরে আপনার কমন্স-আইও ডিলিট ডিরেক্টরি () বা পোস্ট কোড কোড লোকেদের চালান। এটি কেবল ডিরেক্টরিটিই মুছে দেয় না, তবে আপনার টেস্টফিল যা ডিরেক্টরিটির বাইরে রয়েছে মোছা হচ্ছে। (এটি ডিরেক্টরিকে স্পষ্টভাবে উল্লেখ করে এবং সামগ্রীগুলি মুছে দেয়)। rm -r কেবলমাত্র লিঙ্কটি মুছবে। আপনার এই জাতীয় কিছু ব্যবহার করতে হবে যা ডিফেরেন্সযুক্ত ফাইলগুলি মুছুন: "সন্ধান করুন -L ম্যানডোলেটলেট-টাইপ এফ-এক্সেক আরএম {} \;"।
$ ls dirtodelete testdir
ls: cannot access dirtodelete: No such file or directory
testdir:
আপনি ব্যবহার করতে পারেন:
org.apache.commons.io.FileUtils.deleteQuietly(destFile);
কোনও ফাইল মুছে ফেলে, কখনও ব্যতিক্রম ছুঁড়ে না ফেলে। যদি ফাইল ডিরেক্টরি হয় তবে এটি এবং সমস্ত উপ-ডিরেক্টরি মুছুন। ফাইল.ডিলেট () এবং এই পদ্ধতির মধ্যে পার্থক্য হ'ল: মুছে ফেলার জন্য একটি ডিরেক্টরি খালি থাকতে হবে না। কোনও ফাইল বা ডিরেক্টরি মুছতে না পারলে কোনও ব্যতিক্রম ছুঁড়ে দেওয়া হয় না।
একটি সর্বোত্তম সমাধান যা ব্যতিক্রমটিকে নিয়মিতভাবে পদ্ধতির সাথে পরিচালনা করে যে কোনও পদ্ধতি থেকে নিক্ষিপ্ত ব্যতিক্রমগুলি সর্বদা বর্ণনা করে যে সেই পদ্ধতিটি কী করতে চেষ্টা করেছে (এবং ব্যর্থ হয়েছে):
private void deleteRecursive(File f) throws Exception {
try {
if (f.isDirectory()) {
for (File c : f.listFiles()) {
deleteRecursive(c);
}
}
if (!f.delete()) {
throw new Exception("Delete command returned false for file: " + f);
}
}
catch (Exception e) {
throw new Exception("Failed to delete the folder: " + f, e);
}
}
উত্তরাধিকার প্রকল্পগুলিতে, আমার নেটিভ জাভা কোড তৈরি করা দরকার। আমি এই কোডটি পলিটেক্স কোডের মতো তৈরি করি। ওটা দেখ:
public class FileHelper {
public static boolean delete(File fileOrFolder) {
boolean result = true;
if(fileOrFolder.isDirectory()) {
for (File file : fileOrFolder.listFiles()) {
result = result && delete(file);
}
}
result = result && fileOrFolder.delete();
return result;
}
}
এবং ইউনিট পরীক্ষা:
public class FileHelperTest {
@Before
public void setup() throws IOException {
new File("FOLDER_TO_DELETE/SUBFOLDER").mkdirs();
new File("FOLDER_TO_DELETE/SUBFOLDER_TWO").mkdirs();
new File("FOLDER_TO_DELETE/SUBFOLDER_TWO/TEST_FILE.txt").createNewFile();
}
@Test
public void deleteFolderWithFiles() {
File folderToDelete = new File("FOLDER_TO_DELETE");
Assert.assertTrue(FileHelper.delete(folderToDelete));
Assert.assertFalse(new File("FOLDER_TO_DELETE").exists());
}
}
কোডের নীচে পুনরাবৃত্তভাবে প্রদত্ত ফোল্ডারে সমস্ত সামগ্রী মুছুন।
boolean deleteDirectory(File directoryToBeDeleted) {
File[] allContents = directoryToBeDeleted.listFiles();
if (allContents != null) {
for (File file : allContents) {
deleteDirectory(file);
}
}
return directoryToBeDeleted.delete();
}
এখানে একটি খালি হাড়গুলির একটি প্রধান পদ্ধতি যা একটি কমান্ড লাইন আর্গুমেন্ট গ্রহণ করে, আপনার নিজের ত্রুটিটি পরীক্ষা করতে বা আপনাকে কীভাবে উপযুক্ত দেখায় তা মোল্ড করার প্রয়োজন হতে পারে।
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
public class DeleteFiles {
/**
* @param intitial arguments take in a source to read from and a
* destination to read to
*/
public static void main(String[] args)
throws FileNotFoundException,IOException {
File src = new File(args[0]);
if (!src.exists() ) {
System.out.println("FAILURE!");
}else{
// Gathers files in directory
File[] a = src.listFiles();
for (int i = 0; i < a.length; i++) {
//Sends files to recursive deletion method
fileDelete(a[i]);
}
// Deletes original source folder
src.delete();
System.out.println("Success!");
}
}
/**
* @param srcFile Source file to examine
* @throws FileNotFoundException if File not found
* @throws IOException if File not found
*/
private static void fileDelete(File srcFile)
throws FileNotFoundException, IOException {
// Checks if file is a directory
if (srcFile.isDirectory()) {
//Gathers files in directory
File[] b = srcFile.listFiles();
for (int i = 0; i < b.length; i++) {
//Recursively deletes all files and sub-directories
fileDelete(b[i]);
}
// Deletes original sub-directory file
srcFile.delete();
} else {
srcFile.delete();
}
}
}
আমি আশা করি এটি সাহায্য করবে!
এই সমস্যার সমাধান হতে পারে এরিকসনের উত্তর থেকে কোডটি ব্যবহার করে ফাইল শ্রেণীর মুছে ফেলার পদ্ধতিটি পুনরায় প্রয়োগ করা:
public class MyFile extends File {
... <- copy constructor
public boolean delete() {
if (f.isDirectory()) {
for (File c : f.listFiles()) {
return new MyFile(c).delete();
}
} else {
return f.delete();
}
}
}
কমন্স আইও এবং <জাভা এসই 7 ছাড়াই
public static void deleteRecursive(File path){
path.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.isDirectory()) {
pathname.listFiles(this);
pathname.delete();
} else {
pathname.delete();
}
return false;
}
});
path.delete();
}
ফাইল.ডিলেট () ব্যবহার করে ফাইলগুলি সহজে মুছে ফেলা যায়, তবে ডিরেক্টরিগুলি মোছার জন্য খালি থাকতে হবে। এটি সহজেই করতে পুনরাবৃত্তি ব্যবহার করুন। উদাহরণ স্বরূপ:
public static void clearFolders(String[] args) {
for(String st : args){
File folder = new File(st);
if (folder.isDirectory()) {
File[] files = folder.listFiles();
if(files!=null) {
for(File f: files) {
if (f.isDirectory()){
clearFolders(new String[]{f.getAbsolutePath()});
f.delete();
} else {
f.delete();
}
}
}
}
}
}
আমি এই রুটিনটিকে কোড করেছিলাম যাতে নিরাপদ ব্যবহারের জন্য 3 টি সুরক্ষা মানদণ্ড রয়েছে।
package ch.ethz.idsc.queuey.util;
import java.io.File;
import java.io.IOException;
/** recursive file/directory deletion
*
* safety from erroneous use is enhanced by three criteria
* 1) checking the depth of the directory tree T to be deleted
* against a permitted upper bound "max_depth"
* 2) checking the number of files to be deleted #F
* against a permitted upper bound "max_count"
* 3) if deletion of a file or directory fails, the process aborts */
public final class FileDelete {
/** Example: The command
* FileDelete.of(new File("/user/name/myapp/recordings/log20171024"), 2, 1000);
* deletes given directory with sub directories of depth of at most 2,
* and max number of total files less than 1000. No files are deleted
* if directory tree exceeds 2, or total of files exceed 1000.
*
* abort criteria are described at top of class
*
* @param file
* @param max_depth
* @param max_count
* @return
* @throws Exception if criteria are not met */
public static FileDelete of(File file, int max_depth, int max_count) throws IOException {
return new FileDelete(file, max_depth, max_count);
}
// ---
private final File root;
private final int max_depth;
private int removed = 0;
/** @param root file or a directory. If root is a file, the file will be deleted.
* If root is a directory, the directory tree will be deleted.
* @param max_depth of directory visitor
* @param max_count of files to delete
* @throws IOException */
private FileDelete(final File root, final int max_depth, final int max_count) throws IOException {
this.root = root;
this.max_depth = max_depth;
// ---
final int count = visitRecursively(root, 0, false);
if (count <= max_count) // abort criteria 2)
visitRecursively(root, 0, true);
else
throw new IOException("more files to be deleted than allowed (" + max_count + "<=" + count + ") in " + root);
}
private int visitRecursively(final File file, final int depth, final boolean delete) throws IOException {
if (max_depth < depth) // enforce depth limit, abort criteria 1)
throw new IOException("directory tree exceeds permitted depth");
// ---
int count = 0;
if (file.isDirectory()) // if file is a directory, recur
for (File entry : file.listFiles())
count += visitRecursively(entry, depth + 1, delete);
++count; // count file as visited
if (delete) {
final boolean deleted = file.delete();
if (!deleted) // abort criteria 3)
throw new IOException("cannot delete " + file.getAbsolutePath());
++removed;
}
return count;
}
public int deletedCount() {
return removed;
}
public void printNotification() {
int count = deletedCount();
if (0 < count)
System.out.println("deleted " + count + " file(s) in " + root);
}
}
ঠিক আছে, আসুন একটি উদাহরণ ধরে নেওয়া যাক,
import java.io.File;
import java.io.IOException;
public class DeleteDirectory
{
private static final String folder = "D:/project/java";
public static void main(String[] args) throws IOException
{
File fl = new File(folder);
if(!fl.exists()) // checking if directory exists
{
System.out.println("Sorry!! directory doesn't exist.");
}
else
{
DeleteDirectory dd = new DeleteDirectory();
dd.deleteDirectory(fl);
}
}
public void deleteDirectory(File file) throws IOException
{
if(file.isDirectory())
{
if(file.list().length == 0)
{
deleteEmptyDirectory(file); // here if directory is empty delete we are deleting
}
else
{
File fe[] = file.listFiles();
for(File deleteFile : fe)
{
deleteDirectory(deleteFile); // recursive call
}
if(file.list().length == 0)
{
deleteEmptyDirectory(file);
}
}
}
else
{
file.delete();
System.out.println("File deleted : " + file.getAbsolutePath());
}
}
private void deleteEmptyDirectory(File fi)
{
fi.delete();
System.out.println("Directory deleted : " + fi.getAbsolutePath());
}
}
আরও তথ্যের জন্য নীচের সংস্থানসমূহ দেখুন
rm -rf
চেয়ে অনেক বেশি পারফরম্যান্ট ছিল FileUtils.deleteDirectory
।ব্যাপক বেঞ্চমার্কিংয়ের পরে, আমরা দেখতে পেলাম যে ব্যবহারটি ব্যবহারের rm -rf
চেয়ে বহুগুণ দ্রুত ছিলFileUtils.deleteDirectory
।
অবশ্যই, আপনার যদি একটি ছোট বা সাধারণ ডিরেক্টরি থাকে তবে এটি কোনও ব্যাপার নয় তবে আমাদের ক্ষেত্রে আমাদের একাধিক গিগাবাটি এবং গভীরভাবে নেস্টেড সাব ডিরেক্টরি রয়েছে যেখানে এটি 10 মিনিটের সাথে FileUtils.deleteDirectory
এবং কেবল 1 মিনিটের সাথে লাগবে rm -rf
।
এটি করার জন্য এখানে আমাদের রুক্ষ জাভা বাস্তবায়ন:
// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean deleteDirectory( 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();
return true;
}
return false;
}
আপনি বড় বা জটিল ডিরেক্টরি নিয়ে কাজ করছেন যদি চেষ্টা করা মূল্যবান।
পেয়ারা এক মাছ ধরার নৌকা প্রদান করে: MoreFiles.deleteRecursively()
।
ভাগ করা অনেক উদাহরণের থেকে পৃথক, এটি প্রতীকী লিঙ্কগুলির জন্য অ্যাকাউন্ট করে এবং সরবরাহকৃত পথের বাইরে ফাইলগুলি (ডিফল্টরূপে) মুছবে না।