ABCディレクトリ内のすべてのファイルを削除したい。
試してみると、FileUtils.deleteDirectory(new File("C:/test/ABC/"));
フォルダABCも削除されます。
ディレクトリ内のファイルを削除できるがディレクトリは削除できないワンライナーソリューションはありますか?
ABCディレクトリ内のすべてのファイルを削除したい。
試してみると、FileUtils.deleteDirectory(new File("C:/test/ABC/"));
フォルダABCも削除されます。
ディレクトリ内のファイルを削除できるがディレクトリは削除できないワンライナーソリューションはありますか?
import org.apache.commons.io.FileUtils;
FileUtils.cleanDirectory(directory);
同じファイルで利用可能なこのメソッドがあります。これにより、その下にあるすべてのサブフォルダーとファイルも再帰的に削除されます。
好きですか?
for(File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
これにより、ファイルのみが削除され、ディレクトリは削除されません。
Peter Lawreyの答えは、シンプルで特別なものに依存しないので素晴らしいです。それがあなたのやり方です。サブディレクトリとそのコンテンツも削除するものが必要な場合は、再帰を使用してください。
void purgeDirectory(File dir) {
for (File file: dir.listFiles()) {
if (file.isDirectory())
purgeDirectory(file);
file.delete();
}
}
サブディレクトリとその内容(質問の一部)を節約するには、次のように変更します。
void purgeDirectoryButKeepSubDirectories(File dir) {
for (File file: dir.listFiles()) {
if (!file.isDirectory())
file.delete();
}
}
または、1行のソリューションが必要だったため:
for (File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
このような些細な作業に外部ライブラリを使用することは、他の目的でこのライブラリが必要な場合を除いて、お勧めできません。その場合は、既存のコードを使用することをお勧めします。とにかくApacheライブラリを使用しているように見えるので、そのFileUtils.cleanDirectory()
メソッドを使用します。
これにより、 ABCからファイルのみが削除されます(サブディレクトリは変更されません)。
Arrays.stream(new File("C:/test/ABC/").listFiles()).forEach(File::delete);
これにより、 ABC(およびサブディレクトリ)からファイルのみが削除されます。
Files.walk(Paths.get("C:/test/ABC/"))
.filter(Files::isRegularFile)
.map(Path::toFile)
.forEach(File::delete);
^このバージョンでは、IOExceptionを処理する必要があります
または、これをJava8で使用するには:
try {
Files.newDirectoryStream( directory ).forEach( file -> {
try { Files.delete( file ); }
catch ( IOException e ) { throw new UncheckedIOException(e); }
} );
}
catch ( IOException e ) {
e.printStackTrace();
}
例外処理が非常にかさばるのは残念です。そうでなければ、ワンライナーになります...
public class DeleteFile {
public static void main(String[] args) {
String path="D:\test";
File file = new File(path);
File[] files = file.listFiles();
for (File f:files)
{if (f.isFile() && f.exists)
{ f.delete();
system.out.println("successfully deleted");
}else{
system.out.println("cant delete a file due to open or error");
} } }}
rm -rf
よりもはるかにパフォーマンスが良かっFileUtils.cleanDirectory
た。ワンライナーソリューションではありませんが、広範なベンチマークを行った結果、を使用rm -rf
するよりも何倍も高速であることがわかりましたFileUtils.cleanDirectory
。
もちろん、ディレクトリが小さいか単純な場合は問題ありませんが、この場合、複数のギガバイトと深くネストされたサブディレクトリがあり、で10分以上、。FileUtils.cleanDirectory
で1分しかかかりませんrm -rf
。
これを行うための大まかなJava実装は次のとおりです。
// Delete directory given and all subdirectories and files (i.e. recursively).
//
static public boolean clearDirectory( 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();
file.mkdirs(); // Since we only want to clear the directory and not delete it, we need to re-create the directory.
return true;
}
return false;
}
大規模または複雑なディレクトリを扱っている場合は、試す価値があります。
ディレクトリからすべてのファイルを削除するには、「C:\Example」と言います
File file = new File("C:\\Example");
String[] myFiles;
if (file.isDirectory()) {
myFiles = file.list();
for (int i = 0; i < myFiles.length; i++) {
File myFile = new File(file, myFiles[i]);
myFile.delete();
}
}
フォルダ自体ではなく、サブディレクトリを含むフォルダのすべてのコンテンツを削除する別のJava8Streamソリューション。
使用法:
Path folder = Paths.get("/tmp/folder");
CleanFolder.clean(folder);
とコード:
public interface CleanFolder {
static void clean(Path folder) throws IOException {
Function<Path, Stream<Path>> walk = p -> {
try { return Files.walk(p);
} catch (IOException e) {
return Stream.empty();
}};
Consumer<Path> delete = p -> {
try {
Files.delete(p);
} catch (IOException e) {
}
};
Files.list(folder)
.flatMap(walk)
.sorted(Comparator.reverseOrder())
.forEach(delete);
}
}
Files.walkまたはFiles.deleteを含むすべてのストリームソリューションの問題は、これらのメソッドがIOExceptionをスローすることです。これは、ストリームで処理するのが面倒です。
できるだけ簡潔なソリューションを作成しようとしました。
これはうまくいくと思います(NonlinearFruitの以前の回答に基づく):
Files.walk(Paths.get("C:/test/ABC/"))
.sorted(Comparator.reverseOrder())
.map(Path::toFile)
.filter(item -> !item.getPath().equals("C:/test/ABC/"))
.forEach(File::delete);
乾杯!
package com;
import java.io.File;
public class Delete {
public static void main(String[] args) {
String files;
File file = new File("D:\\del\\yc\\gh");
File[] listOfFiles = file.listFiles();
for (int i = 0; i < listOfFiles.length; i++)
{
if (listOfFiles[i].isFile())
{
files = listOfFiles[i].getName();
System.out.println(files);
if(!files.equalsIgnoreCase("Scan.pdf"))
{
boolean issuccess=new File(listOfFiles[i].toString()).delete();
System.err.println("Deletion Success "+issuccess);
}
}
}
}
}
すべてのファイルを削除したい場合は削除します
if(!files.equalsIgnoreCase("Scan.pdf"))
それが機能するステートメント。