我要删除包含其内容的文件夹。如果文件结构如下:
TestFolder
-Folder1
--File1
-Folder2
--File2
--File3
通过使用以下代码,数组应按以下顺序包含文件:{Folder1,Folder2,File1,Folder3,File2,File3}
import java.io.*;
import java.nio.channels.FileChannel;
import java.nio.file.Paths;
import java.nio.file.Path;
import java.nio.file.Files;
class Folder{
private int filesCount = 0;
private File[] files;
private int counter = 0;
private void getFilesArray() throws IOException{
paths = new String[countFiles(path)];
thisFolder(path);
}
private void countFiles(File folder) throws IOException{
File[] content = (new File(folder)).listFiles();
for (File file:content){
if (file.isDirectory()){
countFiles(file);
}
filesCount++;
}
}
private void thisFolder(File folder) throws IOException{
if (folder.exists()){
File[] content = file.listFiles();
for (File file:content){
files[counter] = file;
counter++;
if (file.isDirectory()){
thisFolder(file);
}
}
}else{
throw new IOException("Folder was deleted while it was still opened: "+file.getAbsolutePath());
}
}
//...
}
我想通过使用File []-Array删除文件夹的内容:
public boolean delete(){
for (int count = filesCount-1; count >= 0;count--){
if(files[count].exists()){
if(files[count].delete()==false){
System.out.println("Failed to delete "+files[count]);
for (String temp:files[count].list())
System.out.println(" remaining content "+temp);
return false;
}else{
System.out.println("Properly deleted "+files[count].getAbsolutePathPath());
}
}
}
if (folder.delete()){
return true;
}else{
System.out.println(2);
return false;
}
}
我需要通过多种其他方法使用File []-Array,并且实际上希望我正在创建的Folder对象包含我创建它的那一刻可能是过时的内容。如果不起作用,则delete方法应返回false。错误处理在另一个类中。现在的问题:
它会在首次运行时删除所有文件属性,并删除我运行该程序之前为空的所有文件夹,但是即使我现在已为空,它也无法删除包含内容的文件夹,而我没有运行该程序。
这里是调试输出(第一次运行):
//Properly deleted Folder2\File3.txt
//Properly deleted Folder2\File2.txt
//Failed to delete Folder2
// remaining content File2.txt
// remaining content File3.txt
//program aborted
这里是调试输出(第二次运行):
//Properly deleted Folder2
//Properly deleted Folder1\File1.txt
//Failed to delete Folder1
// remaining content File1.txt
//program aborted
这是调试输出(第三次运行):
//Properly deleted Folder1
//Properly deleted TestFolder
//program completed
当然,目录仅用于测试程序,因此我确定其中没有其他(隐藏)文件。对于测试,也没有使用文件夹内容的其他程序或方法,因此,即使我将代码用于其编程内容时,即使它可能有所不同,对于该测试,我也绝对确定File [ ]-数组是实际的!我什至从下面的注释中测试了递归方法,但是即使调试输出有所不同,我仍然遇到相同的问题,因为我访问文件和文件夹的顺序不同。 有什么技巧可以使文件再次变为实际状态?也许像File.update();
这样的命令感谢您的帮助:)
答案 0 :(得分:3)
您偏离了轨道。首先,放弃睡眠。没必要。
接下来,您如何确定要按正确的顺序删除?我个人不会以您执行的方式删除它。我将创建一种递归方法,以删除文件及其内容。
void deleteMe(File file) {
if (file.isDirectory()) {
for (File subfile: file.listFiles) {
deleteMe(subfile);
}
}
file.delete();
}
对于上面的代码调试,在删除调用之前,我可以添加如下调试:
System.out.printf("File: %s. Number of subfiles: %d\n", file.getName(), file.listFiles().length).
(类似的东西。)
只需确保它正在执行您认为正在执行的操作即可。
答案 1 :(得分:0)
我终于发现,为什么delete()方法没有解决!在计算文件夹大小的方法(为此为0mB)中,我打开了一个fileChannel并忘记了正确关闭它。似乎可以解决这个问题。现在,我添加了close()命令,它可以正常工作……多么愚蠢的错误^^ 感谢任何尝试帮助我的人:)