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()
Untestedを使ってフォルダを削除できるはずです。
ワンライナーです。
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();
}
JDK 7では、Files.walkFileTree()
とFiles.deleteIfExists()
を使ってファイルのツリーを削除できます。
JDK 6では、1つの可能な方法はApache Commonsからの FileUtils.deleteQuietly を使用することです。これはファイル、ディレクトリ、またはファイルとサブディレクトリを含むディレクトリを削除します。
Apache Commons-IOを使用すると、次のようになります。
import org.Apache.commons.io.FileUtils;
FileUtils.forceDelete(new File(destination));
これはFileUtils.deleteDirectory
より(わずかに)パフォーマンスが優れています。
私はJava 8上でこの解決策を好む:
Files.walk(pathToBeDeleted)
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.forEach(File::delete);
私の基本的な再帰バージョンは、JDKの古いバージョンで動作します。
public static void deleteFile(File element) {
if (element.isDirectory()) {
for (File sub : element.listFiles()) {
deleteFile(sub);
}
}
element.delete();
}
これが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;
}
});
}
}
私はこの解決策が一番好きです。サードパーティのライブラリを使用せず、代わりに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;
}
});
}
グァバ21+救助に。削除するディレクトリを指し示すシンボリックリンクがない場合にのみ使用します。
com.google.common.io.MoreFiles.deleteRecursively(
file.toPath(),
RecursiveDeleteOption.ALLOW_INSECURE
) ;
(この質問はグーグルによってよく索引付けされているので、他の場所で他の答えと重複しているとしても、グアバを使用する他の人々はこの答えを見つけることができてうれしいかもしれません。)
あなたはFileUtils.deleteDirectoryを使うことができます。 Javaは、File.delete()を使用して空でないfoldresを削除できません。
前述のように、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))
spring-core
依存関係を使うことができます。
boolean result = FileSystemUtils.deleteRecursively(file);
サブフォルダがある場合は、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);
}
}
ディレクトリにファイルがある場合、ディレクトリを単に削除することはできません。そのため、最初にディレクトリを削除し、次にディレクトリを削除する必要があります。
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() );
}
}
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);
}
}
private void deleteFileOrFolder(File file){
try {
for (File f : file.listFiles()) {
f.delete();
deleteFileOrFolder(f);
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
あなたは次のように試すことができます
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();
}
}
チャームのように機能します。フォルダとファイルの両方に。サラム:)