0 0

关于用Java实现删除指定目录下的所有文件的问题25

[size=medium]问题描述: 我现在用Java实现了一个删除指定目录下所有文件的程序,算法是用递归来实现的。但是文件数量超过8000个的时候就会出现StackOverflowError。
    不知道是否有达人做过类似的东西或遇到过这样的问题,能否解决这个问题?望指教。
[/size]
2010年4月22日 21:36

20个答案 按时间排序 按投票排序

0 0

应该是文件太多了吧

2010年5月06日 20:01
0 0

用java调用dos命令,如果在linux下面应该也有相关删除目录的命令。

2010年5月06日 19:50
0 0

org.apache.commons.io.FileUtils
这种工具类就找apache

2010年5月06日 11:09
0 0

public static void deleteTempPath(File file) throws Exception {
        if(file.isDirectory()) {
            File[] filelist = file.listFiles();
            for(int i = 0; i < filelist.length; i ++) {
                deleteTempPath(filelist[i]);
            }
            if(!file.delete()) {
                throw new Exception("删除临时文件失败!");
            }
        }
        else {
            if(!file.delete()) {
                throw new Exception("删除临时文件失败!");
            }
        }
    }

2010年5月05日 16:35
0 0

为什么不在java 里嵌入一段c程序呢?

char * parentparth="rd /s /q  path";
system(parentparth);

2010年5月05日 12:53
0 0

使用操作系统的命令来删除吧

2010年4月28日 11:55
0 0

1:分步操作,不要一次性递归到底
2:用Runtime的exec执行操作系统的命令删除,可以先判断操作系统类型,再做命令的选择.

2010年4月27日 20:45
0 0

用链表存储节点   做广度优先遍历吧

        LinkedList list = new LinkedList();
        File dir = new File("c:\\java\\");
        File file[] = dir.listFiles();
        for (int i = 0; i < file.length; i++) {
            if (file[i].isDirectory())
                list.add(file[i]);
            else
                file[i].delete();
        }
        File tmp;
        while (!list.isEmpty()) {
            tmp = list.removeFirst();
            if (tmp.isDirectory()) {
                file = tmp.listFiles();
                if (file == null)
                    continue;
                for (int i = 0; i < file.length; i++) {
                    if (file[i].isDirectory())
                        list.add(file[i]);
                    else
                        file[i].delete();
                }
            } else {
                tmp.delete();
            }
        }
       

这个代码就问题。。!!!
LinkedList list = new LinkedList(); 这个相当无聊。

2010年4月27日 16:23
0 0

引用
贴出你的程序吧,估计是你的递归有问题。一般在文件夹层数达到一定的数量后才可能引起StackOverflowError,跟文件个数没关系


是按最深的层数算的  有一个层级数量多了 就会出错  这个不能保证吧

2010年4月26日 13:20
0 0

用链表存储节点   做广度优先遍历吧

        LinkedList list = new LinkedList();
        File dir = new File("c:\\java\\");
        File file[] = dir.listFiles();
        for (int i = 0; i < file.length; i++) {
            if (file[i].isDirectory())
                list.add(file[i]);
            else
                file[i].delete();
        }
        File tmp;
        while (!list.isEmpty()) {
            tmp = list.removeFirst();
            if (tmp.isDirectory()) {
                file = tmp.listFiles();
                if (file == null)
                    continue;
                for (int i = 0; i < file.length; i++) {
                    if (file[i].isDirectory())
                        list.add(file[i]);
                    else
                        file[i].delete();
                }
            } else {
                tmp.delete();
            }
        }
       

2010年4月26日 13:11
0 0

贴出你的程序吧,估计是你的递归有问题。一般在文件夹层数达到一定的数量后才可能引起StackOverflowError,跟文件个数没关系

2010年4月26日 12:59
0 0

别用递归。。。

2010年4月25日 22:08
0 0

我看 调用系统 比较靠谱

2010年4月25日 16:54
0 0

StackOverflowError怎么会出现如此问题呢。
我几个TB的文件用递归都删除了。文件数更是不可计算。

2010年4月24日 10:01
0 0

用循环来做个深度优先搜索,lz可以去百度一下。

2010年4月23日 22:23
0 0

可以分一部分删了,然后再删吖..

2010年4月23日 17:50
0 0

你把文件全部列出来,然后for循环

2010年4月23日 15:54
0 0


   这个很容易,我以前也是递归删除的。后面在网上找资料和通过别人帮助,发现一种很简单的方法。不说了,直接贴出代码:

  

 /**
		 * 通过命令删除文件或文件夹(会删除文件夹里所有文件) 只能在windows上使用,如果
		 * 在Unix或linux上,则修改相应命令
		 * 
		 * @param _file
		 */
		 public static void deleteFileByWindowsCommand(File _file) {
			 Runtime rt = Runtime.getRuntime();   
			 String cmd = null;
			  try {   
				  if(_file.isFile()) {
					  cmd = "cmd.exe /c del /q/a/f/s "+_file.getAbsolutePath();
				  } else {
					  cmd = "cmd.exe /c rd /s/q "+_file.getAbsolutePath();
				  }
			      rt.exec(cmd);   
		      }catch(IOException e){   
			      e.printStackTrace();   
			  }   
			}

2010年4月23日 14:26
0 0

要考虑java io怎样删除一个文件

必然是把文件都读取到内存中吧

8000个文件都读到内存中然后进行删除,结果还没到删除那步就先内存不足了

也得考虑递归方式,是深度递归还是广度递归

无论何种递归都要先删除一部分已经找到文件(释放内存)然后再继续递归

2010年4月22日 21:54
0 0

建议不要单纯的运用递归。
超过一定层数就会 stackOverFlow了。

观察下win7下面删除一个文件夹,刚开始的时候是在计算要删除的文件夹的总共文件数。

计算出来之后再开始删除。

你也可以按照类似的思路,先便利文件的数量,
然后分多个线程去分别删除不同的目录。

这样各个递归的层数都能再控制之中,就避免stackOverFlow了~~~

2010年4月22日 21:45

相关推荐

    java 删除指定目录下的文件

    在Java编程语言中,删除指定目录下的文件是一个常见的任务,特别是在处理文件系统操作时。本文将深入探讨如何使用Java API来实现这一功能,主要关注`java.io`和`java.nio.file`这两个包中的相关类和方法。 首先,...

    Java中删除文件、删除目录及目录下所有文件

    这段代码会尝试删除指定路径的文件。如果文件存在并且成功删除,`delete()`方法将返回`true`;否则返回`false`。 2. 删除空目录: 同样使用`delete()`方法,可以删除空目录。但如果目录非空,操作将会失败。 ``...

    java删除指定文件夹下文件

    以上就是使用Java删除指定文件夹下文件的基本步骤和关键知识点。通过`SimpleFileVisitor`,我们可以更灵活地控制文件和目录的删除操作,实现复杂的需求。在实际项目中,一定要注意异常处理和权限问题,确保代码的...

    java中读取目录下指定的文件

    在Java编程语言中,读取目录下指定的文件是一项常见的任务,这主要涉及到文件I/O操作。Java提供了丰富的API来处理文件系统相关的操作,包括读取、创建、删除文件以及遍历目录等。这里我们将详细讲解如何在Java中实现...

    java程序实现文件夹删除

    这个方法会尝试删除指定的文件,并返回一个布尔值,表示操作是否成功。例如: ```java import java.io.File; public class FileDelete { public static void main(String[] args) { File file = new File("path_...

    java 删除文件夹内指定前缀名字的所有文件

    这里我们将深入探讨如何在Java中删除文件夹内指定前缀名字的所有文件。首先,我们需要了解`java.io.File`类,它是Java标准库中的核心类,用于处理文件和目录。 `File`类提供了丰富的静态和实例方法来创建、读取、...

    java删除本地文件.txt

    本文将详细介绍如何使用Java程序删除本地文件。这涉及到对Java标准库中的`java.io.File`类的理解与应用。 ### 一、理解`java.io.File` `java.io.File`是Java中用于表示文件路径名的抽象表示形式的类。它提供了一...

    java 下载文件 压缩且删除源文件(支持文件夹与文件)

    1、指定文件可下载并且服务器端会删除此文件。 2、指定文件夹(文件夹中必须有一个文件),程序会自动的压缩文件为 zip,然后下载删除源文件与压缩文件。 3、可以指定文件都为最后生成为zip文件下载,且删除源文件...

    遍历目录下所有的文件_遍历文件夹文件_java遍历目录下所有文件_

    在Java编程语言中,遍历一个目录下的所有文件和子目录是一项常见的任务,尤其是在处理文件系统操作时。这里我们将深入探讨如何使用Java API来实现这一功能,并解释相关的知识点。 首先,Java提供了`java.io.File`类...

    java实现对文件的各种操作的工具类.md

    # java实现对文件的各种操作的工具类 ## 可以实现的操作有: 1. 删除单个文件 2. 删除文件夹及文件夹下的文件 ... 从指定目录下载文件 14. 将指定目录下的所有文件构造成树结构 15. 获取文件或文件夹的大小

    java中遍历某个目录下的所有文件及文件夹中的文件

    在Java开发中,经常会遇到需要遍历指定目录及其子目录下所有文件的情况。本文将详细介绍如何使用Java标准库中的`java.io.File`类来实现这一功能。我们将通过一个简单的递归函数来演示如何遍历目录、列出所有文件的...

    java实现pdf上传,下载,在线预览,删除,修改等功能

    使用Java的Servlet技术,可以通过设置HTTP响应头来指示浏览器下载文件,而不是在新窗口中打开。注意设置合适的MIME类型(如application/pdf)和文件名。 3. **在线预览**: 在线预览PDF需要将PDF内容转化为可以在...

    java 在指定的目录下创建多个临时文件

    在Java编程语言中,创建多个临时...总结来说,Java提供了强大的文件操作功能,通过`File`和`Files`类,我们可以方便地在指定目录下创建多个临时文件。通过理解这些API,开发者能够灵活地满足各种临时文件存储的需求。

    java上传文件到linux服务器,操作linux服务器上文件,下载linux服务器文件,删除linux服务器文件

    本篇文章将深入探讨如何使用Java来实现对Linux服务器的文件上传、操作、下载和删除,以及如何借助ganymed-ssh2库实现远程操作。 首先,让我们了解基础概念。Linux服务器是一种基于Linux操作系统并提供网络服务的...

    FTP完全删除文件,及上传下载删除目录

    java远程FTP浏览文件及操作文件删除,上传下载

    java递归实现删除文件夹

    - `File.delete()`: 这是`File`类中的一个方法,用于删除指定的文件或目录。如果删除的是一个空目录,此方法将成功;但如果目录非空,该方法将失败,除非递归删除所有子文件和子目录。 3. **递归删除实现** - ...

    操作系统实习 java实现模拟文件管理系统

    - **删除目录下的文件(DELETEF)**:允许用户删除指定的文件。 - **打开文件(OPENF)**:实现文件的打开操作。 - **关闭文件(CLOSEF)**:支持文件的关闭功能。 - **显示目录内容(SHOWD)**:用于查看当前目录中...

    JAVA SFTP文件上传、下载及批量下载实例

    6. rm():删除指定文件 7. mkdir():创建目录 8. rmdir():删除目录 在使用JSch库时,我们需要了解它的基本使用方法。下面是一个简单的示例代码: ```java public class SFTPUtils { private static Logger log =...

    java删除指定目录下指定格式文件的方法

    删除指定目录下指定格式文件的实现原理是通过使用递归遍历目录的方法,来遍历所有文件和子目录。首先,使用 listFiles() 方法获取当前目录下的所有文件和子目录,然后,遍历所有文件和子目录,如果是子目录,则递归...

    JAVA实现SFTP上传,下载,删除等方法

    下载文件使用`get`方法,将远程文件保存到本地。 ```java FileOutputStream fos = new FileOutputStream("localFilePath"); sftpChannel.get("remoteFilePath", fos); fos.close(); ``` 5. **文件删除** ...

Global site tag (gtag.js) - Google Analytics