代码之家  ›  专栏  ›  技术社区  ›  BlairHippo

无法访问Java创建的文件-有时

  •  1
  • BlairHippo  · 技术社区  · 16 年前

    在爪哇,我正在使用WiXP下运行的代码来创建这样的文件:

    
       public synchronized void store(Properties props, byte[] data) {
          try {
             File file = filenameBasedOnProperties(props);
             if ( file.exists() ) {
                return;
             }         
             File temp = File.createTempFile("tempfile", null);
             FileOutputStream out = new FileOutputStream(temp);
             out.write(data);
             out.flush();
             out.close();
             file.getParentFile().mkdirs();
             temp.renameTo(file);
          } 
          catch (IOException ex) {
             // Complain and whine and stuff
          }
       }
    

    有时,以这种方式创建文件时,即使应用程序没有运行,也几乎无法从代码外部完全访问该文件(尽管负责打开和读取该文件的代码没有问题)。通过Windows资源管理器访问时,我无法移动、重命名、删除甚至打开文件。在cygwin手下,当我 ls -l 目录:

    ls: cannot access [big-honkin-filename]
    total 0
    ?????????? ? ? ? ?            ? [big-honkin-filename]
    

    正如所暗示的,文件名很大,但是xp的最大长度不超过260个字符(尽管略多于200个字符)。

    更进一步地说,我的电脑只是想让我觉得自己很蠢,有时由这段代码创建的文件是完全正常的。我发现的唯一模式是,一旦目录“locks”中有一个文件,其余的文件就会被破坏。

    以前有人遇到过这样的事情,或者对这里发生的事情有什么见解吗?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Christian Semrau Louis Wasserman    16 年前

    尽管根据定义,ntfs应该处理的路径长度不超过2^15-1,但实际上路径的长度限制为255。

    您可以创建路径名较长的文件(文件名包括父文件夹名),但之后无法访问它们。在这些情况下,我得到的错误是找不到文件。要删除这些文件,我必须缩短父文件夹的名称,直到路径长度足够短。

        2
  •  3
  •   Darin Dimitrov    16 年前

    确保你总是在 finally 块。在您的情况下,如果抛出异常,则流可能无法关闭,并将泄漏文件句柄。你可以用 procexp 从sysinternals查看哪个进程持有文件的句柄。