【问题标题】:isDirectory() returns true for a fileisDirectory() 为文件返回 true
【发布时间】:2011-10-05 02:51:47
【问题描述】:

在我的 java 程序中,我复制了一个文件并删除了新文件。

在我的方法removeFile()我检查它是否是一个目录:

String fileName = "G:/1310628353186Examples.csv";
File f = new File(fileName);
if (f.isDirectory()) {
    System.out.println( "'" + fileName + "' is a directory" );
    String[] files = f.list();
    if (files != null && files.length > 0)
        throw new IllegalArgumentException("Delete: directory not empty: " + fileName);
}

有时我收到"'G:/1310628353186Examples.csv' is a directory",有时我没有。

当我调试代码并且 f.isDirectory()true 并且我检查 f.isDirectory 中的内容时,调试器说它是 false

我在 Windows 7 Professional 上运行 Eclipse SDK 3.4.0 和 JDK 1.6。

【问题讨论】:

  • 什么是fileName?使用System.out.println( "'" + f + "' is a directory" ); 检查f 中的内容!
  • 你说f.isDirectory()被评估为真,但调试器说它是假的?这不可能是真的;)
  • 我知道 :DI 启动调试器...它会跳转到 isDirectory() 的代码中...但是如果我用 watch 检查 isDirectory() 会显示错误...而 f.list( ) 为空。
  • 也许值得尝试isFile() 而不是isDirectory()
  • 同样的问题...有时是真的...有时是假的。 isFile() 为 true 或 isDirectory()

标签: java file directory java-io


【解决方案1】:

您检查f 是否是一个目录,但您打印fileName。所以也许你只是检查/打印错误的变量?除非这只是你的问题中的一个错字。

【讨论】:

  • 好收获!我盯着那个代码块看了整整 3 分钟,什么也没得到 :)
  • 我忘记了第一行。抱歉:/
  • 那么你应该按照 Carlos 的提示打印 f 而不是 fileName(以及它的一些属性,例如 getPath()getAbsolutePath()getName()
  • System.out.println("f: "+f); System.out.println("f.getPath(): "+f.getPath()); System.out.println("f.getAbsolutePath(): "+f.getAbsolutePath()); System.out.println("f.getName(): "+f.getName()); f: G:\1310631051940Example.csv f.getPath(): G:\1310631051940Example.csv f.getAbsolutePath(): G:\1310631051940Example.csv f.getName(): 1310631051940Beispiele.csv 'G:\1310631051940Example.csv一个目录
  • f.getName(): 1310631051940Beispiele.csv 我假设你忘记翻译这个了 ;) 但我不知道为什么 isDirectory() 会返回 true...
【解决方案2】:

尝试添加检查文件是否存在,isDirectory() 也会在文件不存在的情况下返回 false:

if (f.exists() && f.isDirectory()) {

【讨论】:

    【解决方案3】:

    如果文件被隐藏,例如 Documents 中的 My Music 链接(Windows 生成的快捷方式文件,它不是真正的快捷方式),那么它将测试为isdirectory 但它不会像目录一样运行;您无法获得目录列表。用户生成的快捷方式就像文件一样。

    2013 年 5 月 31 日: 在最近的更新中,“文档”中的“我的音乐”链接不再测试为 is_hidden。但是,从“我的音乐”的文件对象获取的目录列表确实返回 NULL,可以对其进行测试。

    【讨论】:

      【解决方案4】:

      我在 OSX 上遇到了同样的问题。我创建了一个常规文件,isDirectory() 函数返回trueisFile() 返回false。 (在任何地方都找不到任何证据表明 API 会出现这种行为)。

      我在 OSX 上解决它的方法是手动从文件中读取属性,但您也不能使用 BasicFileAttributes - 它也出于某种原因返回 true 用于 isDirectory()false 用于 @ 987654329@.

      适用于 OSX:

      PosixFileAttributes attr = Files.readAttributes(f.toPath(), PosixFileAttributes.class);
      
      System.out.println("File "+f.getName()+
                         ": isDirectory="+(attr.isDirectory() ? "true" : "false")+
                         ", isRegularFile="+(attr.isRegularFile() ? "true" : "false"));
      

      【讨论】:

        【解决方案5】:

        你必须用 try/catch 块包围然后尝试它。

        【讨论】:

        • 一开始,我只使用了 if (files.length > 0) ... 所以我有时会遇到空指针异常。使用 if (files != null && files.length > 0) 不会引发更多异常。
        【解决方案6】:

        这似乎是由 Windows 引起的问题。 Linux 没有这个问题。

        【讨论】:

          猜你喜欢
          • 2017-07-21
          • 1970-01-01
          • 1970-01-01
          • 2013-12-10
          • 1970-01-01
          • 2017-01-28
          • 2016-01-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多