2012-11-22 120 views
2

我在刪除所有選定文件時遇到問題。我想要做的是點擊「添加」後,選擇的文件將被移動到一個新的文件夾,並在他們之前的文件夾中被刪除。一個文件工作正常。它刪除並移動文件。但不止一個,只有第一個被刪除。我的循環識別每個文件只是不刪除它們。我發佈了actionevent。如果需要更多代碼,請告訴我。我已經指出問題所在,所以我認爲,所以你不必搜索代碼。循環僅刪除第一個文件

public void actionPerformed(ActionEvent e) { 
    int returnValue = 0; 
    int option = 0; 
    File[] selectedFiles = new File[0]; 

    if (e.getActionCommand().equals("CLOSE")) System.exit(0); 

    else if (e.getActionCommand().equals("ADD")) { 
     JFileChooser chooser = new JFileChooser(); 
     chooser.setMultiSelectionEnabled(true); 
     returnValue = chooser.showOpenDialog(this);   

     if (returnValue == JFileChooser.APPROVE_OPTION) { 

      File[] file = chooser.getSelectedFiles();     

      try { 
       FileInputStream fstream = null; 
       FileOutputStream ostream = null; 

       for (int i = 0; i < file.length; i++) { 

        fstream = new FileInputStream(file[i]); 
          ostream = new  
             FileOutputStream(file[i].getName()); 

        Path path = Paths.get(file[i].getPath()); 
        byte[] fileArray; 
        fileArray = Files.readAllBytes(path); 

        listModel.add(0, file[i].getName()); 
        selectedFilesList.setModel(listModel); 
            //ostream.write(fileArray, 0, fileArray.length); 

       } 

       fstream.close(); 
       //ostream.close(); 

       try { 

        for(int i = 0; i < file.length; i++) { 
//**----------------------->>>PROBLEM**      
        Files.delete(Paths.get(file[i].getPath())); 
        System.out.println(file[i].getName()); 

        } 


       } catch (NoSuchFileException x) {} 
     System.err.format("%s: no such" + " file or directory%n") 
       } catch (DirectoryNotEmptyException x) { 
        System.err.format("%s not empty%n"); 
       } catch (IOException x) { 
        // File permission problems are caught here. 
        System.err.println(x); 
       } catch (Exception err) { 
      } 
     } 
+0

您是否看到有例外的證據?另外,'IOException'的'catch'子句,特別是'Exception'在它們的輸出中相當吝嗇。堆棧跟蹤將比只是異常的字符串表示(或者沒有!)更有幫助。 –

+0

沒有得到任何例外。它運行,如果我sysout文件名它顯示了3個文件選擇,但試圖刪除時只有第一次去。 – rogerthat

+0

你在什麼系統上,什麼是java版本,以及位於網絡共享上的文件?我剛剛閱讀了一些關於Windows上較老java版本的問題,這些文件描述符在文件駐留在網絡驅動器上時沒有正確釋放。 – Axel

回答

4

這可能是由於您未能在第一個循環中關閉文件流而導致的。

  for (int i = 0; i < file.length; i++) { 
       fstream = new FileInputStream(file[i]); 
         ostream = new  
            FileOutputStream(file[i].getName()); // This is never closed 

       Path path = Paths.get(file[i].getPath()); 
       byte[] fileArray; 
       fileArray = Files.readAllBytes(path); 

       listModel.add(0, file[i].getName()); 
       selectedFilesList.setModel(listModel); 
           //ostream.write(fileArray, 0, fileArray.length); 

      } 

      fstream.close(); // Only the last input stream is closed 

應該更像

  for (int i = 0; i < file.length; i++) { 
       try { 
       fstream = new FileInputStream(file[i]); 
       ostream = new  
         FileOutputStream(file[i].getName()); 

        Path path = Paths.get(file[i].getPath()); 
        byte[] fileArray; 
        fileArray = Files.readAllBytes(path); 

        listModel.add(0, file[i].getName()); 
        selectedFilesList.setModel(listModel); 
        //ostream.write(fileArray, 0, fileArray.length); 
       } finally { 
       fstream.close(); 
       ostream.close(); 
       } 
      } 

關閉相同數量的打開文件。

這可能會導致您的問題,通過鎖定除了一個文件之外的所有文件,以防止刪除。

另外你的catch異常塊(最後一條語句)對錯誤沒有任何作用。

+0

我有他們都關閉。但它表現一樣。但我會試試你的方式。至於最後一個例外;應用程序似乎運行只是沒有執行完整的循環這就是爲什麼我不打擾最後一個異常塊,因爲我已經嘗試了一千件事情,讓這個工作和異常沒有被拋出 – rogerthat

+0

它需要在裏面循環。您的代碼示例已將fstream和ostream都關閉了一次,但尚未打開多個文件。就像那個關閉只會影響最近的文件一樣。 –

+0

oohhhhh。先生,我想你是對的。讓我嘗試。 – rogerthat

3

不要移動那樣的文件!

  1. 如果您使用Java 7,請改用此page

  2. 對於舊版本,請使用oldFile.renameTo(newFile)

編輯:要理解爲什麼你的代碼不工作,請使用調試器。我認爲你的刪除循環會因爲例外而留下。

+0

很好。我沒有意識到這一點。但是,這將與爲什麼所有的文件沒有被移動 – rogerthat