Невозможно получить доступ к Java-созданному файлу - иногда - PullRequest
1 голос
/ 13 апреля 2010

В 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]

Как и предполагалось, имена файлов большие, но не более 260 символов для XP (хотя они чуть более 200 символов).

Чтобы еще больше добавить, что мой компьютер просто хочет, чтобы я чувствовал себя глупо, иногда файлы, созданные этим кодом, совершенно нормальны. Единственный шаблон, который я обнаружил, состоит в том, что как только один файл в каталоге «блокируется», остальные закручиваются.

Кто-нибудь когда-нибудь сталкивался с чем-то подобным или имел какое-либо представление о том, что здесь происходит?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2010

Убедитесь, что вы всегда закрываете поток в блоке finally. В вашем случае, если выдается исключение, поток может не закрыться и утечка дескриптора файла. Вы можете использовать procxp из SysInternals, чтобы увидеть, какой процесс удерживает дескриптор файла.

1 голос
/ 13 апреля 2010

Хотя по определению NTFS должна обрабатывать длину пути до 2 ^ 15-1, на практике длина путей ограничена 255.

Вы можете создавать файлы с более длинным именем пути (имя файла, включая имена родительских папок), но впоследствии вы не сможете получить к ним доступ. В этих случаях я получаю сообщение об ошибке: файл не найден. Чтобы избавиться от этих файлов, мне нужно сократить имена родительских папок, пока длина пути не станет достаточно короткой.

...