Per il mio progetto ho bisogno di scaricare un file zip da un server FTP, che rilascia un nuovo zip circa 13 volte l'anno. Ho bisogno di scaricare l'ultimo file seguente convenzione del server di denominazione:
Prefix + release number (one or two digits) + year (two digits) + suffix + ".zip"
Ordinamento di un array di nomi di file contenenti stringhe con numeri
per esempio: ALFP1016F.zip
Il prefisso sarà sempre lo stesso (ALFP) ed il suffisso F o P (sta per " pieno "o" parziale "; ho bisogno solo dei file che terminano con il suffisso F). Oltre a ciò, ci sono molti altri file nella directory che devo ignorare perché hanno prefissi diversi. Quindi, ho bisogno di ottenere il file più recente nella matrice seguendo questo ordine di priorità:
- L'anno più recente. Ovviamente il '99 non dovrebbe essere considerato l'anno più recente.
- più recente numero di release
Per esempio, se ho questo elenco di nomi di file (full server directory):
1stpage712.pdf
1stpage914.pdf
ALFP1015F.zip
ALFP1015P.zip
ALFP716F.zip
ALFP716P.zip
FSFP816F.zip
FSFP816P.zip
mio risultato atteso sarebbe
ALFP716F.zip
perché 16 è l'anno più recente e 7 il numero di rilascio più recente di quell'anno
.
Ecco che cosa ho fatto finora:
//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(); }
}
Ho fatto un tentativo misero a scrivere il metodo returnMostRecent(String[])
, ma abbiamo finito con un pasticcio incomprensibile non vale la pena di essere pubblicati qui.
Come è possibile ordinare questo array e restituire in modo efficace il file più recente in seguito al mio ordine di priorità?
È possibile usare [espressioni regolari con Cattura di gruppi] (https://docs.oracle.com/javase/tutorial/essential/regex/groups.html) per isolare le parti importanti dei nomi dei file e quindi usarli per trovare la versione più recente (non è necessario ordinarli effettivamente). Se questo è troppo complicato, usa più 'substring()' per fare lo stesso. –