【问题标题】:Search Entire Computer for a File Name in Java在整个计算机中搜索 Java 中的文件名
【发布时间】:2010-11-06 19:19:48
【问题描述】:

有没有办法在整个计算机中搜索表示 Java 中文件名的字符串值?这将不知道计算机上驱动器的名称。

【问题讨论】:

    标签: java file search


    【解决方案1】:

    您可以通过查看文件名、递归地获取目录(如果是目录)等来遍历文件系统。

    如果症结在于如何获取计算机上的驱动器,请查看 File.listRoots() 函数以获取驱动器号列表。

    预计到达时间:

    为了绝对安全,您需要对递归处理进行一些限制。文件系统中可能存在带有符号链接等的循环(尤其是在 LINUX/UNIX 中,但第三方工具也可以在 Windows 中启用此功能)。

    为确保在处理符号链接时不会陷入循环,请使用 File.getCanonicalPath 方法获取目录的“真实”路径并跟踪所有访问过的规范路径。您还可以使用 getCanonicalFile 并跟踪所有文件,但这可能不是必需的,除非您真的想避免偶尔会处理同一文件两次的情况。

    【讨论】:

    • 我想知道这是否可以在 linux 中工作......因为驱动器不是根目录,而是根文件系统中的文件夹
    • 顾名思义,该方法将简单地返回单个根文件系统;它没有说明驱动器。
    • 注意可能产生无限递归的链接。 @Nuno:当然。当包含其挂载点的目录被“列出”时,将返回一个挂载的驱动器。
    • @erickson :谢谢你的解释。想知道是否有可能检测到文件只是符号链接
    • @Nuno - 更新了我的答案以阐明如何处理由于符号链接而导致的递归。
    【解决方案2】:

    您可以使用 File 对象来确定您正在查看的是文件还是目录:

    File file = new File("/"); //root
    

    然后,当您递归(或根据您的喜好进行迭代)时,您将进行简单的检查:

    if(tempFile.isDirectory())
         //do recursive call on that directory
    else
         //perform check on file name
    

    【讨论】:

      【解决方案3】:

      可以对整个文件系统使用递归调用:可以使用java.io.File的以下方法:

      1. listRoots():列出根文件(在 Windows 中是驱动器,在 Mac OS X 和 linux 中是 '/')。

      2. listFiles():列出目录的封闭文件

      【讨论】:

        【解决方案4】:

        也不要忘记递归处理中的异常。由于访问权限限制,某些文件夹可能无法访问。另外,Windows 系统文件夹“系统卷信息”无法在 Windows 资源管理器中输入,所以我想如果您尝试以编程方式进入,它会抛出异常。

        【讨论】:

          猜你喜欢
          • 2013-09-24
          • 1970-01-01
          • 1970-01-01
          • 2012-01-20
          • 1970-01-01
          • 1970-01-01
          • 2014-10-27
          • 2011-03-22
          • 1970-01-01
          相关资源
          最近更新 更多