Как проверить, существует ли файл при загрузке с FTP - PullRequest
3 голосов
/ 29 ноября 2010

Я загружаю с FTP-сервера и не знаю точно, как проверить, существует ли файл.Я хочу получить имя файла с FTP-сервера, а затем сравнить его со всеми файлами в папке.Если файл уже существует, он сравнивает следующее имя файла FTP со всеми файлами в папке и так далее.Я уже провел сравнение, и оно работает, если все файлы из папки имеют то же имя, что и файлы на FTP-сервере, но если я добавлю какой-нибудь более старый файл, он снова загрузит все файлы, и я этого не хочу.

Вот мой рабочий код:

String[] names = client.listNames();
        File folder = new File("c:\\test\\RTR_ZIP\\");
        String[] filename = folder.list();

        for (;i<names.length;i++) {
            name = names[i];

            exists=false;

                if (name.contains(".zip")) {

                    if (filename.length == 0) {
                        new_file = new FileOutputStream("C:\\test\\RTR_ZIP\\" + name);
                        client.retrieveFile(name, new_file);
                        j++;
                        exists=true;
                    } else {
                            for (;k<filename.length;k++) {
                            name = names[i];
                            i++;
                            name1=filename[k];
    //                        CHECK IF FILE EXISTS
                                    if (!name.equals(name1)) {
                                        new_file = new FileOutputStream("C:\\test\\RTR_ZIP\\" + name);
                                        client.retrieveFile(name, new_file);
                                        j++;
                                        exists=true;
                                    } 
                            }
                      }//else
                }//if contains .zip
        }//for

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 29 ноября 2010

Если ваш ftp-сервер поддерживает команду XCRC, можно сравнить контрольную сумму (CRC32) локального и удаленного файла.Вы можете перебрать все файлы в папке и сравнить ее crc с локальным.

import java.io.File;
import java.io.IOException;
import java.net.SocketException;
import java.util.Scanner;

import org.apache.commons.io.FileUtils;
import org.apache.commons.net.ftp.FTPClient;

public class DownloadFile {

 private FTPClient client = new FTPClient();

 public void connect() throws SocketException, IOException {
  client.connect("127.0.0.1");
  client.login("user", "password");
 }

 public boolean hasXCRCSupport() throws IOException {
  client.sendCommand("feat");
  String response = client.getReplyString();
  Scanner scanner = new Scanner(response);
  while(scanner.hasNextLine()) {
   String line = scanner.nextLine();
   if(line.contains("XCRC")) {
    return true;
   }
  }
  return false;
 }

 public boolean isSameFile() throws IOException {
  if(hasXCRCSupport()) {
   File file = new File("D:/test.txt");
   String localCRC = Integer.toHexString((int) FileUtils.checksumCRC32(file)).toUpperCase();
   client.sendCommand("XCRC /test.txt");
   String response = client.getReplyString().trim();
   System.out.println(response);
   if(response.endsWith(localCRC)) {
    return true;
   }
  }
  return false;
 }
 public void logout() throws IOException {
  client.logout();
 }

 public static void main(String[] args) throws SocketException, IOException {
  DownloadFile downloadFile = new DownloadFile();
  downloadFile.connect();
  if(downloadFile.isSameFile()) {
   System.out.println("remote file is same as local");
  }
  downloadFile.logout();
 }
}
2 голосов
/ 29 ноября 2010

Вы должны проверить существование, используя java.io.File.exists и java.io.File.isFile()|isDirectory().

1 голос
/ 01 декабря 2010

Может быть, это будет полезно кому-то с такой же проблемой.Я сделал программу этим методом:

package javaapplication2;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.net.ftp.*;



public class DLFile {

  public static void saveZIP() throws Exception {

        FTPClient client = new FTPClient();
        FileOutputStream new_file = null;
        String server = "server";
        String user = "user";
        String pass = "pass";
        String name = "";
        String downloadFolder = "download_folder";
        Boolean exists = null;
        int i=0;
        int j=0;

        client.connect(server);
        client.login(user,pass);
        client.changeWorkingDirectory("/rtr/");

//read ftp content
            String[] names = client.listNames();
            File folder = new File(downloadFolder);
            String[] filename = folder.list();

            for (;i<names.length;i++) {
                name = names[i];               
                exists=false;

                    if (name.contains(".zip")) {
                        if (filename.length == 0) {
                            new_file = new FileOutputStream(downloadFolder + name);
                            client.retrieveFile(name, new_file);
                            j++;
                            exists=true;
                        } else {

//CHECK IF FILE EXISTS                            
                            if (!new File(downloadFolder + name).exists()) {
                                new_file = new FileOutputStream(downloadFolder + name);
                                client.retrieveFile(name, new_file);
                                j++;
                                exists=true;
                            }

                         }//else
                    }//if contains .zip
            }//for

            if (exists = true) {
                System.out.println("Downloading ZIP files: Downloaded " + j + " files");
            } else System.out.println("Downloading ZIP files: Files already exist.");

            client.logout();

  }
}
...