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

时间:2010-04-13 15:19:30

标签: java file-io windows-xp

在Java中,我正在使用在WinXP下运行的代码来创建这样的文件:


   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个字符)。

为了进一步增加我的计算机只是让我感到愚蠢的感觉,有时这段代码创建的文件是完全正常的。我发现的唯一模式是,一旦目录中的一个文件“锁定”,其余文件就会被搞砸。

之前有人遇到类似这样的事情,或者对这里发生的事情有任何见解?

2 个答案:

答案 0 :(得分:3)

确保始终在finally块中关闭流。在您的情况下,如果抛出异常,流可能不会被关闭并且将泄漏文件句柄。您可以使用SysInternals中的procexp来查看哪个进程拥有该文件的句柄。

答案 1 :(得分:1)

虽然根据定义,NTFS应该处理最多2 ^ 15-1的路径长度,但实际上路径的长度限制为255.

您可以创建具有较长路径名的文件(包含父文件夹名称的文件名),但之后您无法访问它们。我在这些情况下得到的错误是无法找到该文件。为了摆脱这些文件,我必须缩短父文件夹的名称,直到路径长度足够短。