web-dev-qa-db-ja.com

Javaを使用してファイルを含むフォルダを削除する方法

Javaを使用してディレクトリを作成および削除したいのですが、うまくいきません。

File index = new File("/home/Work/Indexer1");
if (!index.exists()) {
    index.mkdir();
} else {
    index.delete();
    if (!index.exists()) {
        index.mkdir();
    }
}
85
Mr.G

Javaはデータが入っているフォルダを削除することはできません。フォルダを削除する前に、すべてのファイルを削除する必要があります。

のようなものを使う:

String[]entries = index.list();
for(String s: entries){
    File currentFile = new File(index.getPath(),s);
    currentFile.delete();
}

そうすれば、index.delete() Untestedを使ってフォルダを削除できるはずです。

84
Cemron

ワンライナーです。

import org.Apache.commons.io.FileUtils;

FileUtils.deleteDirectory(new File(destination));

ドキュメンテーション ここ

150
Barry Knapp

これはうまくいきますが、ディレクトリテストをスキップするのは非効率的に見えますが、そうではありません。テストは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();
}
89
Jeff Learman

JDK 7では、Files.walkFileTree()Files.deleteIfExists()を使ってファイルのツリーを削除できます。

JDK 6では、1つの可能な方法はApache Commonsからの FileUtils.deleteQuietly を使用することです。これはファイル、ディレクトリ、またはファイルとサブディレクトリを含むディレクトリを削除します。

22
Andrey Chaschev

Apache Commons-IOを使用すると、次のようになります。

import org.Apache.commons.io.FileUtils;

FileUtils.forceDelete(new File(destination));

これはFileUtils.deleteDirectoryより(わずかに)パフォーマンスが優れています。

18
JRA_TLL

私はJava 8上でこの解決策を好む:

  Files.walk(pathToBeDeleted)
    .sorted(Comparator.reverseOrder())
    .map(Path::toFile)
    .forEach(File::delete);

このサイトから: http://www.baeldung.com/Java-delete-directory

17
nirmal

私の基本的な再帰バージョンは、JDKの古いバージョンで動作します。

public static void deleteFile(File element) {
    if (element.isDirectory()) {
        for (File sub : element.listFiles()) {
            deleteFile(sub);
        }
    }
    element.delete();
}
9
Pierre Lemée

これが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;
            }
        });
    }
}
8
BullyWiiPlaza

私はこの解決策が一番好きです。サードパーティのライブラリを使用せず、代わりにJava 7の NIO2 を使用します。

/**
 * 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;
        }
    });
}
4
Javo

グァバ21+救助に。削除するディレクトリを指し示すシンボリックリンクがない場合にのみ使用します。

com.google.common.io.MoreFiles.deleteRecursively(
      file.toPath(),
      RecursiveDeleteOption.ALLOW_INSECURE
) ;

(この質問はグーグルによってよく索引付けされているので、他の場所で他の答えと重複しているとしても、グアバを使用する他の人々はこの答えを見つけることができてうれしいかもしれません。)

3

あなたはFileUtils.deleteDirectoryを使うことができます。 Javaは、File.delete()を使用して空でないfoldresを削除できません。

2
ISSAM RESS

前述のように、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))
2
Gavriel Cohen

spring-core依存関係を使うことができます。

boolean result = FileSystemUtils.deleteRecursively(file);
1

サブフォルダがある場合は、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);
        }
    }
1
Panthro

ディレクトリにファイルがある場合、ディレクトリを単に削除することはできません。そのため、最初にディレクトリを削除し、次にディレクトリを削除する必要があります。

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();
    }
}
1

サブディレクトリが存在する場合は再帰呼び出しをすることができます

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() );
}
}
1
Mr. P

JDKクラスを参照している回答のほとんど(最近でさえ)は File.delete() に頼っていますが、オペレーションが黙って失敗する可能性があるので、それは欠陥のあるAPIです。
Java.io.File.delete()メソッドのドキュメントには次のように記載されています。

Java.nio.file.Filesクラスは、ファイルを削除できないときにdeleteをスローするIOExceptionメソッドを定義しています。これはエラー報告やファイルを削除できない理由の診断に役立ちます。

代わりに、エラーメッセージ付きでIOExceptionをスローする Files.delete(Path p) をお勧めします。

実際のコードは次のように書くことができます。

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);
    }
}
1
davidxxx
private void deleteFileOrFolder(File file){
    try {
        for (File f : file.listFiles()) {
            f.delete();
            deleteFileOrFolder(f);
        }
    } catch (Exception e) {
        e.printStackTrace(System.err);
    }
}
0
Marcelo Lopes

あなたは次のように試すことができます

  File dir = new File("path");
   if (dir.isDirectory())
   {
         dir.delete();
   }

フォルダ内にサブフォルダがある場合は、それらを再帰的に削除する必要があります。

        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();
        }

    }

チャームのように機能します。フォルダとファイルの両方に。サラム:)

0
Mushtaque Ahmed