我想使用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();
}
}
Answers:
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
为空。
只是一线。
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);
Files.walk()
API文档中明确指示的由返回的流。我知道,如果不关闭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,它将删除文件,目录或包含文件和子目录的目录。
如前所述,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;
}
});
}
}
我最喜欢这种解决方案。它不使用3rd party库,而是使用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() ,如果你想检查然后做返回boolean 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);
}
}
您可以使用FileUtils.deleteDirectory。JAVA无法使用File.delete()删除非空文件夹。
Directry不能简单地删除包含文件的文件,因此您可能需要先删除文件然后再删除目录
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
。这对于错误报告和诊断为什么无法删除文件很有用。
作为替换,您应该支持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();
}
如果文件夹中有子文件夹,则可能需要递归删除它们。
private void deleteFileOrFolder(File file){
try {
for (File f : file.listFiles()) {
f.delete();
deleteFileOrFolder(f);
}
} catch (Exception e) {
e.printStackTrace(System.err);
}
}
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();
}
}
奇迹般有效 。对于文件夹和文件。萨拉姆:)