2013-04-09 56 views
3

我有一個處理文件內容的j​​ava應用程序,然後我需要將它移動到另一個位置。java file.renameTo()在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下!在Windows下正常工作)

權的舉動失敗後,我考我是否可以創建一個文件叫做newFileName以及我是否可以刪除原始文件。新文件將被創建,而原始文件無法刪除。 有趣的是,我可以在應用程序運行時(在失敗之後)從命令行中刪除原始文件。

任何想法爲什麼是這個或任何其他選擇?

更多細節:我在unix下工作,爲了遺留原因我必須使用java 1.6(因此我無法恢復到從java 1.7開始支持的Files.move())。

+0

你是否將它移動到不同的文件系統/ NFS? – dogbane 2013-04-09 15:59:05

+0

您是否檢查過由您的代碼創建的文件的屬性,可能是JVM沒有權限訪問該文件,或者您的應用程序代碼是作爲沒有讀/寫訪問權限的別名運行? – 2013-04-09 16:00:04

+0

@dogbane不,我實際上將其移動到創建原始文件的文件夾的子文件夾中(子文件夾存在)。 – 2013-04-09 16:02:01

回答

1

我在java應用程序中發現了什麼問題。

基本上我使用自定義FileFilter從目錄中提取文件的列表。這給了我一個數組File[] foundFiles。 我後來做的是使用問題中的代碼片段在while循環中讀取每個文件。該文件被讀出於某種原因 緊接着我使用從數組作爲參數的第i個文件的構造

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

創建了一個新File對象,然後我試圖重新命名這一個。

現在由於某種原因,這在Windows下工作,而它不在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]對象,使其正常工作。

希望這可以幫助,但我不知道爲什麼第一個版本可以在windows下工作,而不是在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 [I]產生。getName())但方法getName只提供文件的名稱,而不提供其文件路徑!

通過經由新文件創建文件(foundFiles [I] .getParent()+文件分割符+ foundFiles [I] .getName()),結果將被:

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