title: How to copy a file on the FTP server to a directory on the same server in Java?
body: <p>I'm using Apache Commons FTP to upload a file. Before uploading I want to check if the file already exists on the server and make a backup from it to a backup directory on the same server.</p>
  
  <p><strong>Does anyone know how to copy a file from a FTP server to a backup directory on the same server?</strong></p>
  
  <pre><code>public static void uploadWithCommonsFTP(File fileToBeUpload){
      FTPClient f = new FTPClient();
      FTPFile backupDirectory;
      try {
          f.connect(server.getServer());
          f.login(server.getUsername(), server.getPassword());
          FTPFile[] directories = f.listDirectories();
          FTPFile[] files = f.listFiles();
          for(FTPFile file:directories){
              if (!file.getName().equalsIgnoreCase("backup")) {
                  backupDirectory=file;
              } else {
                 f.makeDirectory("backup");
              }
          }
          for(FTPFile file: files){
              if(file.getName().equals(fileToBeUpload.getName())){
                  //copy file to backupDirectory
              }
          }
  
      } catch (IOException e) {
          e.printStackTrace();
      }
  
  }
  </code></pre>
  
  <hr>
  
  <p><strong>Edited code:</strong> still there is a problem,  when i backup zip file, the backup-ed file is corrupted. </p>
  
  <p><strong>Does any body know the reason for it?</strong></p>
  
  <pre><code> public static void backupUploadWithCommonsFTP(File fileToBeUpload) {
      FTPClient f = new FTPClient();
      boolean backupDirectoryExist = false;
      boolean fileToBeUploadExist = false;
      FTPFile backupDirectory = null;
      try {
          f.connect(server.getServer());
          f.login(server.getUsername(), server.getPassword());
          FTPFile[] directories = f.listDirectories();
          // Check for existence of backup directory
          for (FTPFile file : directories) {
              String filename = file.getName();
              if (file.isDirectory() &amp;&amp; filename.equalsIgnoreCase("backup")) {
                  backupDirectory = file;
                  backupDirectoryExist = true;
                  break;
              }
          }
          if (!backupDirectoryExist) {
              f.makeDirectory("backup");
          }
          // Check if file already exist on the server
          f.changeWorkingDirectory("files");
          FTPFile[] files = f.listFiles();
          f.changeWorkingDirectory("backup");
          String filePathToBeBackup="/home/user/backup/";
          String prefix;
          String suffix;
          String fileNameToBeBackup;
          FTPFile fileReadyForBackup = null;
          f.setFileType(FTP.BINARY_FILE_TYPE);
          f.setFileTransferMode(FTP.BINARY_FILE_TYPE);
          for (FTPFile file : files) {
              if (file.isFile() &amp;&amp; file.getName().equals(fileToBeUpload.getName())) {
                  prefix = FilenameUtils.getBaseName(file.getName());
                  suffix = ".".concat(FilenameUtils.getExtension(file.getName()));
                  fileNameToBeBackup = prefix.concat(Calendar.getInstance().getTime().toString().concat(suffix));
                  filePathToBeBackup = filePathToBeBackup.concat(fileNameToBeBackup);
                  fileReadyForBackup = file;
                  fileToBeUploadExist = true;
                  break;
              }
          }
          // If file already exist on the server create a backup from it otherwise just upload the file.
          if(fileToBeUploadExist){
              ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
              f.retrieveFile(fileReadyForBackup.getName(), outputStream);
              InputStream is = new ByteArrayInputStream(outputStream.toByteArray());
              if(f.storeUniqueFile(filePathToBeBackup, is)){
                  JOptionPane.showMessageDialog(null, "Backup succeeded.");
                  f.changeWorkingDirectory("files");
                  boolean reply = f.storeFile(fileToBeUpload.getName(), new FileInputStream(fileToBeUpload));
                  if(reply){
                      JOptionPane.showMessageDialog(null,"Upload succeeded.");
                  }else{
                      JOptionPane.showMessageDialog(null,"Upload failed after backup.");
                  }
              }else{
                  JOptionPane.showMessageDialog(null,"Backup failed.");
              }
          }else{
              f.changeWorkingDirectory("files");
              f.setFileType(FTP.BINARY_FILE_TYPE);
              f.enterLocalPassiveMode();
              InputStream inputStream = new FileInputStream(fileToBeUpload);
              ByteArrayInputStream in = new ByteArrayInputStream(FileUtils.readFileToByteArray(fileToBeUpload));
              boolean reply = f.storeFile(fileToBeUpload.getName(), in);
              System.out.println("Reply code for storing file to server: " + reply);
              if(!f.completePendingCommand()) {
                  f.logout();
                  f.disconnect();
                  System.err.println("File transfer failed.");
                  System.exit(1);
              }
              if(reply){
  
                  JOptionPane.showMessageDialog(null,"File uploaded successfully without making backup." +
                          "\nReason: There wasn't any previous version of this file.");
              }else{
                  JOptionPane.showMessageDialog(null,"Upload failed.");
              }
          }
          //Logout and disconnect from server
          in.close();
          f.logout();
          f.disconnect();
      } catch (IOException e) {
          e.printStackTrace();
      }
  
  }
  </code></pre>