Я хочу створити та видалити каталог за допомогою Java, але він не працює.
File index = new File("/home/Work/Indexer1");
if (!index.exists()) {
index.mkdir();
} else {
index.delete();
if (!index.exists()) {
index.mkdir();
}
}
Я хочу створити та видалити каталог за допомогою Java, але він не працює.
File index = new File("/home/Work/Indexer1");
if (!index.exists()) {
index.mkdir();
} else {
index.delete();
if (!index.exists()) {
index.mkdir();
}
}
Відповіді:
Java не в змозі видалити папки з даними, що знаходяться в ній. Перед видаленням папки потрібно видалити всі файли.
Використовуйте щось на кшталт:
String[]entries = index.list();
for(String s: entries){
File currentFile = new File(index.getPath(),s);
currentFile.delete();
}
Тоді ви зможете видалити папку, використовуючи index.delete()
Неперевірений!
FileUtils.deleteDirectory
як сказав @Francesco Menzani.
if (!index.delete()) {...}
. Потім, якщо індекс є символічним посиланням, він видаляється незалежно від того, чи видається він у ньому вмістом.
entries
недійсний.
Просто однолінійний.
import org.apache.commons.io.FileUtils;
FileUtils.deleteDirectory(new File(destination));
Документація тут
Це працює, і хоча здається, що пропустити тест каталогів неефективно, це не так: тест відбувається відразу listFiles()
.
void deleteDir(File file) {
File[] contents = file.listFiles();
if (contents != null) {
for (File f : contents) {
deleteDir(f);
}
}
file.delete();
}
Оновіть, щоб уникнути наступних символьних посилань:
void deleteDir(File file) {
File[] contents = file.listFiles();
if (contents != null) {
for (File f : contents) {
if (! Files.isSymbolicLink(f.toPath())) {
deleteDir(f);
}
}
}
file.delete();
}
Я вважаю за краще це рішення на Java 8:
Files.walk(pathToBeDeleted)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
З цього веб-сайту: http://www.baeldung.com/java-delete-directory
Files.walk()
, який прямо вказано в документах API. Я знаю, що якщо ви не закриєте потік, який повертається, Files.list()
наприклад, у вас може закінчитися ручками, і програма вийде з ладу. Див., Наприклад, stackoverflow.com/q/36990053/421049 та stackoverflow.com/q/26997240/421049 .
У JDK 7 ви можете використовувати Files.walkFileTree()
та Files.deleteIfExists()
видаляти дерево файлів. (Зразок: http://fahdshariff.blogspot.ru/2011/08/java-7-deleting-directory-by-walking.html )
У JDK 6 одним із можливих способів є використання FileUtils.deleteQuietly з Apache Commons, який видалить файл, каталог або каталог з файлами та підкаталогами.
Використовуючи Apache Commons-IO, він виконує наступну однолінійку:
import org.apache.commons.io.FileUtils;
FileUtils.forceDelete(new File(destination));
Це (трохи) ефективніше, ніж FileUtils.deleteDirectory
.
Як згадувалося, Java не може видалити папку, яка містить файли, тому спочатку видаліть файли, а потім папку.
Ось простий приклад для цього:
import org.apache.commons.io.FileUtils;
// First, remove files from into the folder
FileUtils.cleanDirectory(folder/path);
// Then, remove the folder
FileUtils.deleteDirectory(folder/path);
Або:
FileUtils.forceDelete(new File(destination));
Моя основна рекурсивна версія, що працює зі старими версіями JDK:
public static void deleteFile(File element) {
if (element.isDirectory()) {
for (File sub : element.listFiles()) {
deleteFile(sub);
}
}
element.delete();
}
listFiles()
повертається нуль, а не викликати isDirectory()
.
Це найкраще рішення для Java 7+
:
public static void deleteDirectory(String directoryFilePath) throws IOException
{
Path directory = Paths.get(directoryFilePath);
if (Files.exists(directory))
{
Files.walkFileTree(directory, new SimpleFileVisitor<Path>()
{
@Override
public FileVisitResult visitFile(Path path, BasicFileAttributes basicFileAttributes) throws IOException
{
Files.delete(path);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path directory, IOException ioException) throws IOException
{
Files.delete(directory);
return FileVisitResult.CONTINUE;
}
});
}
}
Guava 21+ на допомогу. Використовуйте лише якщо немає символьних посилань, які вказували б на каталог, для видалення.
com.google.common.io.MoreFiles.deleteRecursively(
file.toPath(),
RecursiveDeleteOption.ALLOW_INSECURE
) ;
(Це питання добре індексується Google, тому інші люди Usig Guava можуть бути раді знайти цю відповідь, навіть якщо вона зайва іншими відповідями в інших місцях.)
Мені це рішення подобається найбільше. Він не використовує сторонні бібліотеки, натомість використовує NIO2 Java 7.
/**
* Deletes Folder with all of its content
*
* @param folder path to folder which should be deleted
*/
public static void deleteFolderAndItsContent(final Path folder) throws IOException {
Files.walkFileTree(folder, 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 {
if (exc != null) {
throw exc;
}
Files.delete(dir);
return FileVisitResult.CONTINUE;
}
});
}
Ще одним вибором є використання org.springframework.util.FileSystemUtils
відповідного методу Spring, який буде рекурсивно видаляти весь вміст каталогу.
File directoryToDelete = new File(<your_directory_path_to_delete>);
FileSystemUtils.deleteRecursively(directoryToDelete);
Це зробить роботу!
У цьому
index.delete();
if (!index.exists())
{
index.mkdir();
}
ти дзвониш
if (!index.exists())
{
index.mkdir();
}
після
index.delete();
Це означає, що ви знову створюєте файл після видалення
File.delete () повертає булеве значення. Отже, якщо ви хочете перевірити, то зробітьSystem.out.println(index.delete());
якщо ви отримаєте, true
то це означає, що файл видалено
File index = new File("/home/Work/Indexer1");
if (!index.exists())
{
index.mkdir();
}
else{
System.out.println(index.delete());//If you get true then file is deleted
if (!index.exists())
{
index.mkdir();// here you are creating again after deleting the file
}
}
з коментарів, поданих нижче, оновлена відповідь така
File f=new File("full_path");//full path like c:/home/ri
if(f.exists())
{
f.delete();
}
else
{
try {
//f.createNewFile();//this will create a file
f.mkdir();//this create a folder
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Якщо у вас є папки, ви знайдете проблеми з відповідями на Cemron. тож вам слід створити метод, який працює так:
private void deleteTempFile(File tempFile) {
try
{
if(tempFile.isDirectory()){
File[] entries = tempFile.listFiles();
for(File currentFile: entries){
deleteTempFile(currentFile);
}
tempFile.delete();
}else{
tempFile.delete();
}
getLogger().info("DELETED Temporal File: " + tempFile.getPath());
}
catch(Throwable t)
{
getLogger().error("Could not DELETE file: " + tempFile.getPath(), t);
}
}
Ви можете використовувати FileUtils.deleteDirectory . JAVA не може видалити непорожні папки з File.delete () .
Каталог не може просто видалити, якщо в ньому є файли, тому вам може знадобитися видалити файли спочатку, а потім каталог
public class DeleteFileFolder {
public DeleteFileFolder(String path) {
File file = new File(path);
if(file.exists())
{
do{
delete(file);
}while(file.exists());
}else
{
System.out.println("File or Folder not found : "+path);
}
}
private void delete(File file)
{
if(file.isDirectory())
{
String fileList[] = file.list();
if(fileList.length == 0)
{
System.out.println("Deleting Directory : "+file.getPath());
file.delete();
}else
{
int size = fileList.length;
for(int i = 0 ; i < size ; i++)
{
String fileName = fileList[i];
System.out.println("File path : "+file.getPath()+" and name :"+fileName);
String fullPath = file.getPath()+"/"+fileName;
File fileOrFolder = new File(fullPath);
System.out.println("Full Path :"+fileOrFolder.getPath());
delete(fileOrFolder);
}
}
}else
{
System.out.println("Deleting file : "+file.getPath());
file.delete();
}
}
Ви можете здійснити рекурсивний виклик, якщо існують підкаталоги
import java.io.File;
class DeleteDir {
public static void main(String args[]) {
deleteDirectory(new File(args[0]));
}
static public boolean deleteDirectory(File path) {
if( path.exists() ) {
File[] files = path.listFiles();
for(int i=0; i<files.length; i++) {
if(files[i].isDirectory()) {
deleteDirectory(files[i]);
}
else {
files[i].delete();
}
}
}
return( path.delete() );
}
}
ми можемо використовувати spring-core
залежність;
boolean result = FileSystemUtils.deleteRecursively(file);
Більшість відповідей (навіть останніх), що посилаються на класи JDK, покладаються, File.delete()
але це недосконалий API, оскільки операція може вийти з ладу.
У java.io.File.delete()
документації методу зазначено:
Зауважте, що
java.nio.file.Files
клас визначаєdelete
метод для кидання,IOException
коли файл неможливо видалити. Це корисно для повідомлення про помилки та діагностики, чому файл не можна видалити.
В якості заміни вам слід віддати перевагу Files.delete(Path p)
тому, що передає повідомлення IOException
із помилкою.
Фактичний код може бути записаний таким чином:
Path index = Paths.get("/home/Work/Indexer1");
if (!Files.exists(index)) {
index = Files.createDirectories(index);
} else {
Files.walk(index)
.sorted(Comparator.reverseOrder()) // as the file tree is traversed depth-first and that deleted dirs have to be empty
.forEach(t -> {
try {
Files.delete(t);
} catch (IOException e) {
// LOG the exception and potentially stop the processing
}
});
if (!Files.exists(index)) {
index = Files.createDirectories(index);
}
}
ви можете спробувати наступним чином
File dir = new File("path");
if (dir.isDirectory())
{
dir.delete();
}
Якщо всередині вашої папки є підпапки, можливо, вам доведеться їх рекурсивно видалити.
private void deleteFileOrFolder(File file){
try {
for (File f : file.listFiles()) {
f.delete();
deleteFileOrFolder(f);
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
import org.apache.commons.io.FileUtils;
List<String> directory = new ArrayList();
directory.add("test-output");
directory.add("Reports/executions");
directory.add("Reports/index.html");
directory.add("Reports/report.properties");
for(int count = 0 ; count < directory.size() ; count ++)
{
String destination = directory.get(count);
deleteDirectory(destination);
}
public void deleteDirectory(String path) {
File file = new File(path);
if(file.isDirectory()){
System.out.println("Deleting Directory :" + path);
try {
FileUtils.deleteDirectory(new File(path)); //deletes the whole folder
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
System.out.println("Deleting File :" + path);
//it is a simple file. Proceed for deletion
file.delete();
}
}
Працює як Чарівність. Як для папок, так і для файлів. Салам :)
Видаліть її з іншої частини
File index = new File("/home/Work/Indexer1");
if (!index.exists())
{
index.mkdir();
System.out.println("Dir Not present. Creating new one!");
}
index.delete();
System.out.println("File deleted successfully");
Ви можете використовувати цю функцію
public void delete()
{
File f = new File("E://implementation1/");
File[] files = f.listFiles();
for (File file : files) {
file.delete();
}
}