从FTP下载时如何检查文件是不是存在

Posted

技术标签:

【中文标题】从FTP下载时如何检查文件是不是存在【英文标题】:How to check if file exist when downloading from FTP从FTP下载时如何检查文件是否存在 【发布时间】:2011-05-17 04:10:19 【问题描述】:

我正在从 FTP 服务器下载,但我不知道如何检查文件是否已经存在。我想要做的是从 FTP 服务器检索 filname,然后将其与文件夹中的所有文件进行比较。如果文件已经存在,那么它将下一个 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

提前致谢。

【问题讨论】:

【参考方案1】:

您应该使用java.io.File.existsjava.io.File.isFile()|isDirectory() 检查是否存在。

【讨论】:

@Igor java.io.File.equals。我不明白你为什么需要比较文件。 正如我所说,如果目录中有任何较旧的文件,那么我的比较不起作用。仅当来自 FTP 的文件与目录中的文件相同时才有效。所以这就是为什么我想将来自 FTP 的文件与目录中的每个文件进行比较【参考方案2】:

如果您的 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();
 

【讨论】:

【参考方案3】:

也许它对有同样问题的人有用。我用这种方法制作程序:

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

  

【讨论】:

以上是关于从FTP下载时如何检查文件是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

从 FTP 服务器检查和下载多个文件

在包含空格的批处理文件中使用 WinSCP 时,如何从 FTP 下载中排除子文件夹?

cmd dos 检查远程FTP文件夹是不是存在

如何从 ftp 下载文件?

使用 PHP 下载 FTP 文件 [重复]

如何从 FTP 下载文件并使用 PHP 将其流式传输到客户端