2010-11-29 104 views
2

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

在此先感谢。

回答

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

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

+0

好吧但是如何比较? – Igor 2010-11-29 09:31:11

1

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

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

    } 
} 
相关问题