JFileChooser和复制文件

时间:2015-10-09 04:13:11

标签: java swing file jfilechooser

我正在上课,并且有几个问题,我希望得到帮助。分配是一个GUI,允许用户选择要复制的文件,并选择您要将文件复制到的位置。

我已经完成了作业,但是如果我能改变的话,有几件事我想看看......

选择源文件时,我只想要在Label中显示源文件的名称,但程序需要整个路径才能复制文件,每次我尝试将其切换为显示文件名只是程序不会运行,因为它不知道文件的位置。第二个问题,无论如何都要让程序自动复制一个文件作为.bak文件...说源文件是一个文本文件,用户选择一个目标文件夹并点击副本,它保存一个同名的文件但.bak扩展名?

我把代码放在***之间,并留下我试图用来显示文件名的代码并将其注释掉。谢谢你的帮助!!

public class CopyFile extends JFrame{

private JFileChooser fc;
private JButton copyButton;
private JButton chooseFileButton;
private JButton destinationButton;
private File workingDirectory;
private JLabel sourceLabel;
private JLabel destinationLabel;
private JTextField sourceText;
private JTextField sourceFileText;
private JTextField destinationText;

public static void main(String [] args) {
    CopyFile go = new CopyFile();
    go.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    go.setSize(500, 150);
    go.setVisible(true);
}

public CopyFile() {
    super("Copy a text file");
    setLayout(new GridLayout(3, 3, 5, 5));
    fc = new JFileChooser();

    //Open dialog box inside project folder to make easier to find files
    workingDirectory = new File(System.getProperty("user.dir"));
    fc.setCurrentDirectory(workingDirectory);
    //create labels and buttons for window
    chooseFileButton = new JButton("CHOOSE SOURCE FILE");
    destinationButton = new JButton("DESTINATION FOLDER");
    copyButton = new JButton("COPY FILE");      
    sourceLabel = new JLabel("SOURCE FILE: ");
    sourceText = new JTextField(10);
    sourceText.setEditable(false);
    destinationLabel = new JLabel("DESTINATION: ");
    destinationText = new JTextField(10);

    //add everything to JFrame  
    add(sourceLabel);
    add(sourceText);
    add(chooseFileButton);  
    add(destinationLabel);
    add(destinationText);
    add(destinationButton);
    add(copyButton);

    //Create TheHandler object to add action listeners for the buttons.
    TheHandler handler = new TheHandler();
    chooseFileButton.addActionListener(handler);
    destinationButton.addActionListener(handler);
    copyButton.addActionListener(handler);
}

//Inner class to create action listeners    
private class TheHandler implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        int returnVal;
        String selectedFilePath;
        File selectedFile;

******************************************************************************      
        //Selecting a source file and displaying what the user is doing.
        if(event.getSource() == chooseFileButton) {     
            returnVal = fc.showOpenDialog(null);
            //Set the path for the source file. 
            if(returnVal == JFileChooser.APPROVE_OPTION) {  

  /*The two next lines of code are what I was trying to do to get only the
  file name but I get a whole page of errors, mainly I think it's saying no 
  such file exists*/
                //selectedFile = fc.getSelectedFile();
                //sourceText.setText(selectedFile.getName());   
                selectedFilePath = fc.getSelectedFile().getAbsolutePath();
                sourceText.setText(selectedFilePath);
            }       
        }//end if

******************************************************************************          
        //Handle destination button.
        if(event.getSource() == destinationButton) {
            returnVal = fc.showSaveDialog(null);
            if(returnVal == JFileChooser.APPROVE_OPTION) {
                 selectedFilePath = fc.getSelectedFile().getAbsolutePath();
                destinationText.setText(selectedFilePath);
            }               
        }//end if

        //Handle copy button
        if(event.getSource() == copyButton) {
            File sourceFile = new File(sourceText.getText());
            File destinationFile = new File(destinationText.getText());
            Path sourcePath = sourceFile.toPath();
            Path destinationPath = destinationFile.toPath();        
            try {
                Files.copy(sourcePath,  destinationPath);
            } catch (IOException e) {
                e.printStackTrace();
            }   
        }//end if

    }//end actionPerformed      
}//end TheHandler class
}//end class

2 个答案:

答案 0 :(得分:2)

  

当选择源文件时,我只想要在Label中显示的源文件的名称,但是,程序需要整个路径才能复制文件,每次我尝试切换它以显示文件仅命名该程序不会运行,因为它不知道文件的位置。

您可以使用File#getName,它将返回文件的名称并将其用作标签的文本,但保留对原始File的引用。您不应该使用标签文字生成新的File参考,只需保留对来源File和目标File以及实例字段的引用

  

第二个问题,无论如何都要使程序自动复制一个文件作为.bak文件...说源文件是一个文本文件,用户选择一个目标文件夹并点击副本,它保存一个文件与同名,但.bak扩展名?

String name = selectedFile.getName();
name = name.substring(0, name.lastIndexOf("."));
name += ".bak";
File destinationFile = new File(destinationPath, name);

会将selectedFile的扩展名更改为.bak,但您应该添加一项检查,看看它是否有一个以

开头的扩展名

答案 1 :(得分:2)

  

您必须将来源目标文件路径保留为   File s,而非String s。将TheHandler类的代码修改为   如下:

  1. 添加selectedSourceFileselectedDestinationFile个本地字段。

    private class TheHandler implements ActionListener {
        private File selectedSourceFile;
        private File selectedDestinationFile;
    
  2. 选择文件时更新它们并设置文件名而不是文本字段的路径。

  3. 源文件按钮

            if (event.getSource() == chooseFileButton) {
                returnVal = fc.showOpenDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    selectedSourceFile = fc.getSelectedFile();
                    sourceText.setText(selectedSourceFile.getName());
                }
            }
    

    目标按钮

            if (event.getSource() == destinationButton) {
                returnVal = fc.showSaveDialog(null);
                if (returnVal == JFileChooser.APPROVE_OPTION) {
                    selectedDestinationFile = fc.getSelectedFile();
                    destinationText.setText(selectedDestinationFile.getName());
                }
            }
    
    1. 复制时使用selectedSourceFileselectedDestinationFile

          if (event.getSource() == copyButton) {
              Path sourcePath = selectedSourceFile.toPath();
              Path destinationPath = selectedDestinationFile.toPath();
              try {
                  Files.copy(sourcePath, destinationPath);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      
    2.   

      现在你完成了第一个要求。你可以在什么时候制作backfile   选择目标文件。所以,添加你的代码来制作备份文件   选择目的地按钮。

              if (event.getSource() == destinationButton) {
                  returnVal = fc.showSaveDialog(null);
                  if (returnVal == JFileChooser.APPROVE_OPTION) {
                      selectedDestinationFile = fc.getSelectedFile();
                      destinationText.setText(selectedDestinationFile.getName());
      
                      //copy backup
                      String name = selectedSourceFile.getName();
                      name = selectedSourceFile.getName().substring(0, name.lastIndexOf(".")) + ".bak";
                      File destinationFile = new File(selectedDestinationFile.getParentFile(), name);
                      try {
                          Files.copy(selectedSourceFile.toPath(), destinationFile.toPath());
                      } catch (IOException ex) {
                          ex.printStackTrace();
                      }
                  }
              }