我想删除ABC目录中的所有文件。
当我尝试使用FileUtils.deleteDirectory(new File("C:/test/ABC/"));
它时,还会删除文件夹ABC。
是否有一种划线员解决方案,我可以删除目录中的文件,但不能删除目录中的文件?
rm -rf directory; mkdir directory
比使用更快FileUtils.cleanDirectory
。
我想删除ABC目录中的所有文件。
当我尝试使用FileUtils.deleteDirectory(new File("C:/test/ABC/"));
它时,还会删除文件夹ABC。
是否有一种划线员解决方案,我可以删除目录中的文件,但不能删除目录中的文件?
rm -rf directory; mkdir directory
比使用更快FileUtils.cleanDirectory
。
Answers:
import org.apache.commons.io.FileUtils;
FileUtils.cleanDirectory(directory);
在同一文件中有此方法。这还将递归删除其下的所有子文件夹和文件。
rm -rf directory
比使用更为有效FileUtils.cleanDirectory
。
你是说喜欢吗?
for(File file: dir.listFiles())
if (!file.isDirectory())
file.delete();
这只会删除文件,不会删除目录。
for(File file: dir.listFiles())
大概的意思是... for (File file : new java.io.File("C:\\DeleteMeFolder").listFiles())
...
彼得·劳瑞(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();
}
}
或者,由于您需要一种解决方案:
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
或在Java 8中使用它:
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");
} } }}
另一个Java 8 Stream解决方案,用于删除文件夹的所有内容(包括子目录,但不删除文件夹本身)。
用法:
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,这在流中很难处理。
我试图创建一个尽可能简洁的解决方案。
要从目录中删除所有文件,请说“ 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();
}
}
rm -rf
是很多比更好的性能FileUtils.cleanDirectory
。不是单线解决方案,而是经过广泛的基准测试后,我们发现使用的rm -rf
速度比使用的速度快好几倍FileUtils.cleanDirectory
。
当然,如果您有一个小型目录或简单目录,都没关系,但是在我们的例子中,我们有多个GB和深嵌套的子目录,使用时将花费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;
}
如果您要处理大型或复杂目录,则值得尝试。
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"))
声明它将起作用。