2012-11-22 5 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'과 특히'Exception'에 대한'catch' 절이 출력물에서 다소 인색합니다. 스택 추적은 예외의 문자열 표시 (또는 아무것도 표시하지 않는 것)보다 도움이됩니다. –

+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

둘 다 닫았습니다. 그러나 그것은 똑같이 행동했습니다. 그러나 나는 당신의 방법을 시도 할 것입니다.마지막 예외에 관해서는; 응용 프로그램이 실행되고있는 것만으로 전체 루프를 실행하지 않는 것 같습니다. 왜이 작업을 수행하기 위해 수천 가지를 시도했기 때문에 마지막 예외 블록을 신경 쓰지 않았고 예외는 throw되지 않았습니다. – rogerthat

+0

내부에 있어야합니다. 루프. 코드 샘플은 fstream과 ostream을 모두 한 번만 닫고 여러 파일을 열어야합니다. 마찬가지로 닫기는 가장 최근의 파일에만 영향을 미칩니다. –

+0

oohhhhh. 나는 네가 옳다고 생각합니다. 나 해보자. – rogerthat

3

그런 파일을 이동하지 마십시오.

  1. Java 7을 사용하는 경우이 page을 보시기 바랍니다.

  2. 이전 버전의 경우 oldFile.renameTo(newFile)을 사용하십시오.

편집 : 코드가 작동하지 않는 이유를 이해하려면 디버거를 사용하십시오. 예외로 인해 삭제 루프가 남아 있다고 생각합니다.

+0

좋은. 나는 그 사실을 모르고 있었다. 그러나 그것은 모든 파일이 이동되지 않는 이유와 관련이 있습니다. – rogerthat

관련 문제