Java 删除文件(奇怪的扩展名)

Java 删除文件(奇怪的扩展名),java,file,Java,File,当我想使用Java删除存储库中的文件时,我遇到了一个问题。我想做的是检查存储库是否存在,如果存在,我想删除它包含的所有文件。 这是我的密码: File f = new File(this.pathToFolder); if (f.exists() && f.isDirectory()) { for (int i = 0; i < f.listFiles().length ; i++) { f.listFiles()[i].delete(); }

当我想使用Java删除存储库中的文件时,我遇到了一个问题。我想做的是检查存储库是否存在,如果存在,我想删除它包含的所有文件。 这是我的密码:

File f = new File(this.pathToFolder); 

if (f.exists() && f.isDirectory()) {
  for (int i = 0; i < f.listFiles().length ; i++) {    
    f.listFiles()[i].delete(); 
  }
}     
else {
  f.mkdir();
}
在控制台中,我得到了很多“假”(大约15),然后最终得到了一个“真”

我不明白为什么会这样。也许你们中的一些人会有一个想法

谢谢,,
Vaclav

代码的问题是,在删除文件时修改了listFiles()数组,因此每次循环中数组的大小都在缩小

试试这个

for (File file : f.listFiles()) {
    file.delete();
}

您的第一种方法(for循环)的问题已经解决了

关于你的第二种方法,我有点猜测。我假设(没有验证)当您进行下一次迭代时,删除尚未完成。因此listFiles()[0]可能仍然与上一次迭代中的相同

如果您的代码打印的输出行(true或false)比目录中的文件多,我会认为我猜得对

无论如何,Joakim Danielson提出的解决方案

for (File file : f.listFiles()) {
    file.delete();
}
。。。通过只调用一次listFiles(),然后在生成的数组上迭代来解决这两个问题

您可以通过稍微修改代码来实现同样的效果(不那么优雅):

File f = new File(this.pathToFolder); 

if (f.exists() && f.isDirectory()) {
  File[] files = f.listFiles(); // calling listFiles only once ...
  for (int i = 0; i < files.length ; i++) { // ... and then operating on the resulting array
    files[i].delete(); 
  }
}     
else {
  f.mkdir();
}
File f=新文件(this.pathToFolder);
if(f.exists()&f.isDirectory()){
File[]files=f.listFiles();//只调用一次listFiles。。。
对于(int i=0;i
。。。没有测试-我希望我没有犯错误

顺便说一句,
列表文件的javadoc说:

无法保证结果数组中的名称字符串将以任何特定顺序出现;特别是,它们不能保证按字母顺序出现


这是处理目录时不要多次调用listFiles()的另一个很好的理由。

尝试使用迭代器对文件进行迭代

for (Iterator<File> it = Arrays.stream(f.listFiles()).iterator(); it.hasNext();) {
    File file = it.next();  
    file.delete();
}
for(Iterator it=Arrays.stream(f.listFiles()).Iterator();it.hasNext();){
File=it.next();
delete();
}

可能正在被另一个进程使用。在Windows上,
sysinternals
工具可以告诉您哪个进程正在使用哪个文件。您可能无权对这些文件执行删除操作。您好,问题确实是这些文件被其他程序使用了!谢谢你的帮助!你好,问题是这些文件被另一个程序使用,所以我还不能删除它们。无论我多么感谢您的回答,我都很好地记录了您的评论并修改了我的代码!:)
for (Iterator<File> it = Arrays.stream(f.listFiles()).iterator(); it.hasNext();) {
    File file = it.next();  
    file.delete();
}