2

選択したファイルをすべて削除するのに問題があります。私がやろうとしているのは、「追加」をクリックした後、選択したファイルが新しいフォルダーに移動され、前のフォルダーで削除されることです。1つのファイルは正常に機能します。ファイルを削除して移動します。ただし、複数あり、最初の 1 つだけが削除されます。私のループは、ファイルを削除するだけでなく、各ファイルを認識しています。アクションイベントを掲載しています。さらにコードが必要な場合はお知らせください。問題がどこにあるかを示したので、コードを検索する必要はないと思います。

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) {
            }
        }
4

2 に答える 2

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();
               }
            }

開いたファイルと同じ数のファイルを閉じます。

これにより、1 つを除くすべてのファイルがロックされ、削除が妨げられ、問題が発生する可能性があります。

また、キャッチ例外ブロック(最後のステートメント)はエラーに対して何もしません。

于 2012-11-22T20:27:32.053 に答える
3

そのようにファイルを移動しないでください。

  1. Java 7 を使用している場合は、代わりにこのページをご覧ください。

  2. 古いバージョンの場合は、 を使用してoldFile.renameTo(newFile)ください。

編集:コードが機能しない理由を理解するには、デバッガーを使用します。例外のため、削除ループが残っていると思います。

于 2012-11-22T20:26:57.247 に答える