对于我的项目,我需要从FTP服务器下载一个zip文件,每年可以发布一个新的zip约13次.我需要按照服务器的命名约定下载最新的文件:
前缀版本号(一位或两位数字)年份(两位数)后缀“.zip”
前缀版本号(一位或两位数字)年份(两位数)后缀“.zip”
例如:
ALFP1016F.zip
前缀将始终是相同的(ALFP),后缀为F或P(代表“full”或“partial”;我只需要以后缀F结尾的文件).此外,目录中还有其他几个文件需要忽略,因为它们具有不同的前缀.然后,我需要按照这个优先顺序获取数组中最新的文件:
>最近一年.当然’99不应该被视为最近一年.
>最新版本号
例如,如果我有这个文件名列表(full server directory):
1stpage712.pdf 1stpage914.pdf ALFP1015F.zip ALFP1015P.zip ALFP716F.zip ALFP716P.zip FSFP816F.zip FSFP816P.zip
我的预期产出是
ALFP716F.zip,因为16是最近一年,7是最近一年的版本号
.
这是我迄今为止做的:
//necessary imports import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; //initialize FTP client ftpClient = new FTPClient(); try { //connect to server ftpClient.connect(server,port); ftpClient.login(username,password); ftpClient.enterLocalPassiveMode(); ftpClient.setFileType(FTP.BINARY_FILE_TYPE); //list all names from server String[]filenames = ftpClient.listNames(); //return expected file name String expectedFileName = returnMostRecent(filenames); } catch (Exception e) { e.printStackTrace(); } finally { try { if (ftpClient.isConnected()) { ftpClient.logout(); ftpClient.disconnect(); System.out.println("Disconnected from server"); } } catch (IOException ex) { ex.printStackTrace(); } }
写了returnMostRecent(String [])方法,我做了一个悲惨的尝试,但最后却出现了一个难以置信的乱码,不值得贴在这里.
我如何排序这个数组,并按照我的优先顺序有效地返回最近的文件?
解决方法
我没有测试过,但我认为它应该工作.
private String returnMostRecent(String[] fileNames) { String file = null; double version = -1; for(String name : listNames) { // skip files that don't match if (!name.matches("ALFP[0-9]*F.zip")) continue; // get digits only String digits = name.replaceAll("\\D+",""); // format digits to <year>.<version> String vstr = digits.substring(digits.length-2,digits.length()) + "."; if (digits.length() < 4) vstr += "0"; vstr = digits.substring(0,digits.length()-2); double v = Double.parseDouble(vstr); if (v > version) { version = v; file = name; } } return file; }