Ciao,
continuo a riportare qui di seguito gli step e i problemi di questo progetto sperando che qualcuno mi illumini prima o poi.
Al momento sto utilizzando sia la libreria Jscape che Zehon. Questo perchè entrambe posseggono dei metodi utili per verificare l'upload di cartelle remote su un server.
Al momento il flusso della mia classe esegue queste operazioni:
1- Connessione a server ftp tramite host,user,pass
2- Verifica presenza cartella root su server remoto
3- Nel caso fosse presente eseguo la sincronizzazione tra le cartelle locale e remota altrimenti fa partire l'upload.
4- La sincronizzazione tra cartella locale e remota esegue queste operazioni:
a- Recupera l'intera struttura della root locale
b- Verifica ogni elemento presente ciclando su una lista di File
c- Se è un file verifica che il file sia già presente nel rispettivo folder remoto
*- Nel caso le dimensioni fosse diverse viene invocato il comando Resume altrimenti viene caricato dall'inizio
d- Se è una directory verifica che sia già presente altrimenti viene create
5- Infine viene verificata la dimensione del folder locale e remota alla fine del processo.
Il problema che ho adesso è quando invoco il comando contenuto nella libreria Zehon per verificare la presenza o meno di una cartella o file nel Server remoto.
L'eccezione che viene scatenata è una org.commons.vfs.FileSystemExcepetion dicendomi che non riesce più a connettersi. Il problema che non capisco per quale motivo questa eccezione non è sempre visibile nello stesso punto ma a volte mi succede dopo 1 file controllato altre volte dopo N file verificati. Il comando scatenante la suddetta eccezione è questo:
codice:
FTP.fileExists(...) o FTP.folderExists(....)
Vi riporto qui di seguito il mio codice sperando di avere qualche illuminazione in merito:
codice:
Ftp ftp = new Ftp();
//capture Ftp related events
ftp.addFtpListener(this);
log.debug("Add Listener");
//set hostname
ftp.setHostname(hostname);
//set username
ftp.setUsername(username);
//set password
ftp.setPassword(password);
//connect
ftp.connect();
//set transfermode
ftp.setBinary();
//get source Dir size
Long localFolderSize = FileUtils.sizeOfDirectory(directory);
//check if directory already exists
if(!rootExists(directory.getName(), ftp.getDirListing())){
//upload full directory
ftp.uploadDir(directory);
//synchronized directory
synchronizerFolder(directory.getName(),directory,ftp,hostname,username,password);
}else{
//synchronize local and remote folder
log.debug("Synchronized local and remote Folder");
synchronizerFolder(directory.getName(),directory,ftp,hostname,username,password);
}
//show tree of remote folder
getFtpDirListing(directory.getAbsolutePath(),ftp);
if(matchingFolder(localFolderSize,remoteFolderSize)){
System.out.println("The local and remote folders size are equal "+"local: "+localFolderSize+" remote: "+remoteFolderSize);
return true;
}else{
System.out.println("The local and remote folders size aren't equal "+"local: "+localFolderSize+" remote: "+remoteFolderSize);
return false;
}
}
public void synchronizerFolder(String string, File dir,Ftp ftp,String hostname, String username, String password) throws FileNotFoundException, FileTransferException {
File startingDirectory= dir;
List<File> files = getFileListing(startingDirectory);
//print out all file names, in the the order of File.compareTo()
for(File file : files ){
System.out.println("Checks that object: "+file);
String cleanFile = cleanPath(file.toString());
String cleanFolder = cleanPath(file.toString()).replace(file.getName(), "");
if(file.isFile()){
try {
if(FTP.fileExists(cleanFile.replace(file.getName(), ""), file.getName(), hostname, username, password)){
long sizeRemoteFile = ftp.getFilesize(cleanFile);
long sizeLocalFile = file.length();
if(!(sizeRemoteFile == sizeLocalFile)){
System.out.println("Resume the local and remote file: "+file);
ftp.resumeUpload(file,cleanFile,1024);
}
}else{
System.out.println("Upload the file: "+file+" into folder "+cleanFolder);
ftp.setDir(cleanFolder);
ftp.upload(file);
ftp.setDirUp();
}
} catch (FileTransferException e) {
e.printStackTrace();
} catch (FtpException e) {
e.printStackTrace();
}
}else if (file.isDirectory()){
try {
if(!FTP.folderExists(cleanFile, hostname, username, password)){
ftp.connect();
System.out.println("Create new dir:"+cleanFolder);
ftp.makeDir(cleanFile);
}
} catch (FtpException e) {
e.printStackTrace();
}
}
}
}