2013-04-09 2 views
3

У меня есть приложение Java, которое обрабатывает содержимое файла, а затем мне нужно переместить его в другое место.java file.renameTo() failed in unix

Это, как я прочитал файл:

String filePath = new String("foo.bar"); 
    String fileContents = new String(""); 
    char[] myBuffer = new char[chunkSize]; 
    int bytesRead = 0; 
    BufferedReader in; 
    try { 
     FileReader fr = new FileReader(filePath); 
     in = new BufferedReader(fr); 
     try { 
      while ((bytesRead = in.read(myBuffer,0,chunkSize)) != -1) 
      { 
       //System.out.println("Read " + bytesRead + " bytes. They were: " + new String(myBuffer)); 
       fileContents+= new String(myBuffer).substring(0, bytesRead); 
      } 
      // close the stream as I don't need it anymore. (If I don't close it, then java would hold the file open thus preventing the subsequent move of the file) 
      in.close(); 
      fr.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     return null; 
    } 

файл должен быть закрыт, поскольку я заканчиваю как входной поток и чтения файлов.

Тогда после этого я пытаюсь переместить файл в другой каталог, используя File.renameTo(newFileName);, но это не удается (под UNIX !, под окнами он работает отлично)

Сразу после движения терпит неудачу, я могу проверить, могу ли я создать файл newFileName и могу ли я удалить исходный файл. Новый файл будет создан, а исходный файл не будет удален. Интересно, что я могу удалить исходный файл из командной строки во время работы приложения (сразу после сбоя).

Любая идея, почему это или любая альтернатива?

Подробнее: Я работаю под UNIX, и я обязан использовать java 1.6 для устаревших причин (поэтому я не могу вернуться к Files.move(), который поддерживается начиная с java 1.7).

+0

Вы перемещаете его в другую файловую систему/NFS? – dogbane

+0

Вы проверили атрибут файлов, созданных вашим кодом, может быть, JVM не имеет разрешения на доступ к файлу, или ваш код приложения работает как псевдоним, который не имеет доступа для чтения/записи? –

+0

@dogbane no Я фактически перемещаю его в подпапку папки, в которой создается исходный файл (существует подпапка). –

ответ

1

Я нашел, в чем проблема в моем приложении java.

В основном я извлекаю список файлов из каталога с использованием настраиваемого FileFilter. Это дает мне массив File[] foundFiles. Что я потом делаю, читает каждый файл в цикле while, используя фрагмент кода в вопросе. Сразу после того, файл читается по какой-то причине я создал новый объект File с помощью I-й файл из массива в качестве параметра для конструктора

File file = new File(foundFiles[i].getName()); // File to be moved 

, а затем я попытался переименовать эту.

Теперь по какой-то причине это работает под окнами, пока оно не находится под unix (файл как-то заблокирован, я думаю, что объект foundFiles[i]).

В самом деле, если я печатаю результаты этих линий

System.out.println("I can read foundFiles[i]: " +foundFiles[i].canRead());// DEBUG 
System.out.println("I can write foundFiles[i]: " +foundFiles[i].canWrite());// DEBUG 
System.out.println("I can read file : " +file.canRead());// DEBUG 
System.out.println("I can write file : " +file.canWrite());// DEBUG 

Я получаю

I can read foundFiles[i]: True 
I can write foundFiles[i]: True 
I can read file: False 
I can write file: False 

Это было достаточно просто использовать renameTo() непосредственно на foundFiles[i] объектов, чтобы сделать его работать нормально.

Надеюсь, это поможет, но я не знаю, почему первая версия будет работать под окнами, а не под UNIX.

0

Давайте проанализируем выше наблюдения ...

I can read foundFiles[i]: True 
I can write foundFiles[i]: True 
I can read file: False 
I can write file: False 

Результат нормально, потому что файл объект был произведен через новый файл (foundFiles [я].getName()), но метод getName содержит только имя файла, без его пути к файлу!

При создании файла с помощью нового файла (foundFiles [я] .getParent() + File.separator + foundFiles [я] .getName()), результаты были бы тогда:

I can read foundFiles[i]: True 
I can write foundFiles[i]: True 
I can read file: True 
I can write file: True