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()
Untested を使用してフォルダを削除できるはずです!
FileUtils.deleteDirectory
@Francesco Menzaniが言ったように、再帰的なメソッドを記述するか、使用する必要があります。
if (!index.delete()) {...}
ます。次に、indexがシンボリックリンクの場合、コンテンツがあるかどうかに関係なく削除されます。
entries
がnull かどうかをチェックする必要があります。
ワンライナーです。
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()
。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では、Apache CommonsからFileUtils.deleteQuietlyを使用して、ファイル、ディレクトリ、またはファイルとサブディレクトリを持つディレクトリを削除する方法が1つ考えられます。
前述のとおり、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()
は、を呼び出すのではなく、nullを返すかどうかを確認する必要があります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;
}
});
}
}
救助にグアバ21+。削除するディレクトリを指すシンボリックリンクがない場合にのみ使用します。
com.google.common.io.MoreFiles.deleteRecursively(
file.toPath(),
RecursiveDeleteOption.ALLOW_INSECURE
) ;
(この質問はGoogleによって適切に索引付けされているため、他の場所で他の回答と重複していても、Guavaを使用する他の人がこの回答を喜んで見つける可能性があります。)
私はこのソリューションが一番好きです。サードパーティのライブラリを使用せず、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;
}
});
}
これで
index.delete();
if (!index.exists())
{
index.mkdir();
}
あなたが呼んでいます
if (!index.exists())
{
index.mkdir();
}
後
index.delete();
あなたが削除した後、再度ファイルを作成していることを、この手段
File.delete()あなたがその後、確認したい場合はブール値を返しますvalue.So 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);
}
}
ファイルが存在する場合、ディレクトリは単純に削除できないため、最初にファイルを削除してからディレクトリを削除する必要がある場合があります。
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();
}
フォルダ内にサブフォルダがある場合は、再帰的に削除する必要がある場合があります。
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();
}
}
チャームのように動作します。フォルダとファイルの両方。サラム:)