[Runtime]attendre fin execution

Résolu
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 - 11 nov. 2006 à 15:46
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 - 15 nov. 2006 à 22:11
Bonjour
je vien de cree une application sous windows; qui se connecte a un serveur FTP via ligne de commande
   String down_cmd = "cmds.txt";.
    String CMD = "ftp -v -s:"+down_cmd;
    Process proc = Runtime.getRuntime().exec(CMD);
j'utilise un fichier de commande pour telecharger un fichier (via get)
mais voila je voudrais que mon  application attende la fin du telechargement du fichier

j'ai utilise waitFor() et sa ne marche pas
le process ne se termine pas, alors que j'ai dans me fichier la comande de deconnexion:

disconnect
bye
exit

pour etre sure de terminer le process

merci pour votre aide
;-)

oqwtkt fgdwv swg fg xkxtg c igpqwz

18 réponses

cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
11 nov. 2006 à 16:08
C'est bon j'ai trouve
il faut recuperer le inputStream du process pour que la JVM connaisse sont etat
java.io.InputStream in = proc.getInputStream();

oqwtkt fgdwv swg fg xkxtg c igpqwz
3
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
11 nov. 2006 à 16:12
Il nefaut pas oublie de lire le flux ;
sinon sa ne marche pas
int i = 0;
while((i = in.read())!= -1);

oqwtkt fgdwv swg fg xkxtg c igpqwz
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 nov. 2006 à 16:16
Salut,

pourquoi ne pas te faire ton truc ftp en pur java ??? c'est assez simple suand meme....
sinon concernant waitFor() enfait il attend la fin du binaire executé avec le exec donc dans le cas d'un exec ftp seul la comande bye arretera le process et non la fin de recption d'un fichier....

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
11 nov. 2006 à 16:21
C'est vrais
je utilise hier  un fichier que j'ai trouve FtpConnection.java
il marche tres bien sur tous les serveurs FTP ,mis a part un seul ,selui sur lequel je dois travailer, et croi moi j'ai fait des pieds et des mains, et je n'es pas touve le probleme
- connexion en mode passif ; il bloque sur l'ouverture du socket pour recuperer la list des fichier "LIST" ,comme si que le serveur FTP nouvrait pas le port
alors qu'avec FileZilla sa marche tres bien

oqwtkt fgdwv swg fg xkxtg c igpqwz
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 nov. 2006 à 18:02
Salut,

ba donne plus d'info sur le code et on va trouver la solution pour que tu reste pure java

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
11 nov. 2006 à 18:27
ben regarde mon client ftp java j'utilise cette classe ... vois si ca marche ...

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
Twinuts Messages postés 5375 Date d'inscription dimanche 4 mai 2003 Statut Modérateur Dernière intervention 14 juin 2023 111
11 nov. 2006 à 19:51
Salut,

c'est du made in [auteurdetail.aspx?ID=234347 sheorogath]donc impossible que cela fonctionne mouhahahahaha que je suis méchant( niark)

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA
0
sheorogath Messages postés 2448 Date d'inscription samedi 21 février 2004 Statut Modérateur Dernière intervention 29 janvier 2010 17
11 nov. 2006 à 19:56
mdr enfoiré

il fonctionne pas trop mal :p booo apres il manque au také de fonction mais bon ce code me gave donc je le laisse de cote

"n'est pas mort ce qui semble a jamais dormir et en d'etrange temps meme la mort peut mourrir"
0
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
12 nov. 2006 à 08:10
Bonjour je vous donne le code:

je l'ai trouve ici
http://www.javafr.com/codes/FTPCONNECTION-ACTIF-PASSIF-RESUME-DOWNLOAD-ETC_22367.aspx
dans le zip

c'est la ou ca bloque



private boolean openPasv() throws IOException
    {
        //On passe en mode passif
        String tmp = getExecutionResponse("PASV");
        System.out.println("tmp:"+tmp);
        String pasv = excludeCode(tmp);
        //On récupère l'IP et le PORT pour la connection
        pasv = pasv.substring(pasv.indexOf("(")+1,pasv.indexOf(")"));
        String[] splitedPasv = pasv.split(",");
        int port1 = Integer.parseInt(splitedPasv[4]);
        int port2 = Integer.parseInt(splitedPasv[5]);
        int port = (port1*256)+port2;
        String ip = splitedPasv[0]+"."+splitedPasv[1]+"."+splitedPasv[2]+"."+splitedPasv[3];
   
        pasvSocket = new Socket(ip,port); // ici
       
        return isPositiveCompleteResponse(Integer.parseInt(tmp.substring(0,3)));
    }

avec la meme code que TestFTP.java
en passive mode

si quelqu'un a un autre client,j'ai pas le temps de tous reprogrammer
 Merci;-)
oqwtkt fgdwv swg fg xkxtg c igpqwz
0
ab2oulem Messages postés 4 Date d'inscription lundi 13 novembre 2006 Statut Membre Dernière intervention 15 novembre 2006
13 nov. 2006 à 18:09
Salut,
Il y a peut être un  bug dans la fonction openPasv()
essai de voir si en modifiant la ligne de cette manière
 pasvSocket = new
 socket(InetAddress.getByName(ip),port)

Si cela ne solve pas ton problème essai le package commons-net d'apache, il  fonctionne très bien en mode passif.
0
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
14 nov. 2006 à 08:54
Sa ne merche pas
je vais utiliser le package d'Apache
merci ;-)
oqwtkt fgdwv swg fg xkxtg c igpqwz
0
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
15 nov. 2006 à 09:23
Je vien de teste le commons net
j'ai mis ca :



FTPClient ftp  = new FTPClient();
          FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
          conf.setServerLanguageCode("fr");
          ftp.configure(conf);
         
          ftp.connect(serverName,portFtp);
   
          ftp.login(userFtp, passFtp);
         
          ftp.changeWorkingDirectory("/");

          ftp.enterRemotePassiveMode();

          FTPFile[] files = ftp.listFiles();       
                
          for(int i = 0; i< files.length;i++)
            System.out.println(files[i].getName());
           
j'arrive a me conneter au serveur mais ,je n'arrive pas a lister
files.length = 0; //Alors que ya des fichiers

si t'as un meilleur exemple, envoi

oqwtkt fgdwv swg fg xkxtg c igpqwz
0
ab2oulem Messages postés 4 Date d'inscription lundi 13 novembre 2006 Statut Membre Dernière intervention 15 novembre 2006
15 nov. 2006 à 10:07
Salut,

Voici  une petit partie du source, j'espère qu'en faisant le ménage je n'ai pas trop supprimer de truc
Ce bout de prog récupère les fichiers sur un serveur ftp du  repertoire /RECEIPTS, les enregistre dans le répertoire C:\\RECEIPTS et  met les fichiers à la même date & heure que sur le serveur ftp.
Tiens moi au courant si cela ne marche pas.

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

public class test {
   

    public static void main(String [] args) {
        test sample = new test();       
        sample.run();
    }

   
    public void run() {
 
    FTPClient ftpclient=new FTPClient();
    try {
            ftpclient.connect( "myserver");
            int reply = ftpclient.getReplyCode();
            if (!FTPReply.isPositiveCompletion(reply))     {
                ftpclient.disconnect();
               
           }
         }
    catch (IOException e) {
        if (ftpclient.isConnected())       {
            try {
                ftpclient.disconnect();
            }
            catch (IOException f)  {}
         }
         
    }
    try {
    if (!ftpclient.login("user","password"))     {
                ftpclient.logout();
         
            }
      ftpclient.setFileType(FTP.BINARY_FILE_TYPE);
      ftpclient.enterLocalPassiveMode();
    
     
      if (ftpclient.changeWorkingDirectory("/RECEIPTS"))
      {
           FTPFile[] files  = ftpclient.listFiles();
        for (int i=0;i<files.length;i++)  {
            System.out.println("Ftp File "+files[i].getName());
            if (files[i].isFile()) {
                OutputStream output = new FileOutputStream("c://RECEIPTS/"+files[i].getName());
                ftpclient.retrieveFile(files[i].getName(), output);
                output.close();
                File fOpen=new File("c://RECEIPTS/"+files[i].getName());
                fOpen.setLastModified(files[i].getTimestamp().getTimeInMillis());
               // ftpclient.deleteFile(files[i].getName()); // delete file on server ftp 
                
            }
           
        }
      }
     ftpclient.logout();
    }
    catch (FTPConnectionClosedException e)     {
        System.out.println("FTPConnectionClosedException " +e.toString());
    }
    catch (IOException e)     {
        System.out.println("IOException " +e.toString());
    }
    finally {
        if (ftpclient.isConnected())  {
            try {ftpclient.disconnect();}
            catch (IOException f)   { }
        }
    }
   
    }

}
 
0
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
15 nov. 2006 à 10:28
Bonjour
sa list;
mais sur le serveur ya plus de 200 fichiers
et sa ne liste pas tous

Merci en tous cas pour l'exemple,il est tres bien

oqwtkt fgdwv swg fg xkxtg c igpqwz
0
ab2oulem Messages postés 4 Date d'inscription lundi 13 novembre 2006 Statut Membre Dernière intervention 15 novembre 2006
15 nov. 2006 à 11:41
Salut,
Inquiétant ce que tu me dis là, car la dernière fois que je l'ai utilisé j'ai remonté 387 fichiers.
Il est vrai que  la liste des fichiers que tu obtiens  est celle des fichiers  du répertoire que tu attaques 
A tu donc + de 200 fichiers dans le repertoire ou tu te positionne avec  la fonction changeWorkingDirectory
ou sont ils dans des sous répertoires ?

 
0
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
15 nov. 2006 à 13:50
Il ny a que le repertoire racine,voila exactement se que j'ai mis,

FTPClient ftp  = new FTPClient();

          FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
          conf.setServerLanguageCode("fr");
          ftp.configure(conf);     
          ftp.connect(serverName,portFtp);        
          ftp.login(userFtp, passFtp);
          ftp.setFileType(FTP.BINARY_FILE_TYPE);
          ftp.enterLocalPassiveMode();       
          ftp.changeWorkingDirectory("/");
         
          FTPFile[] files = ftp.listFiles();
         
         System.out.println("Liste de fichier:"+files.length+"\n");

          for(int i = 0; i< files.length;i++)
            System.out.println(files[i].getName()+"\n");

et voila ce que sa maffiche:

Liste de fichier:257
_20060308_00.csv
_20060309_00.csv
_20060310_00.csv
_20060311_00.csv
_20060312_00.csv
_20060313_00.csv
_20060314_00.csv
_20060315_00.csv
_20060316_00.csv
_20060317_00.csv
_20060318_00.csv
_20060319_00.csv
_20060320_00.csv
20060321_00.csv
_20060322_00.csv
_20060323_00.csv
_20060324_00.csv
_20060326_00.csv
_20060327_00.csv
_20060328_00.csv
_20060329_00.csv
_20060330_00.csv
java.lang.NullPointerException
oqwtkt fgdwv swg fg xkxtg c igpqwz
0
ab2oulem Messages postés 4 Date d'inscription lundi 13 novembre 2006 Statut Membre Dernière intervention 15 novembre 2006
15 nov. 2006 à 18:50
Salut,
Je viens de regarder les sources du package plus profondément et rien ne garantit que le file[i] ne soit pas null.
La fonction parseFTPEntry va traiter la ligne mais si elle  n'arrive pas a faire ses correspondance elle va retournre null.
tu peux contourner cela en modifiant ton code ainsi 
for(int i = 0; i< files.length;i++)

    {

      if  (files[i] != null)

            System.out.println(files[i].getName()+"\n");

    }


A mon avis il serait interresant que tu pousses les investigations un peu plus loin  pour savoir ce qui n'a pas pu être traiter
des fois que ton serveur  ftp aurait  des ratés.  (A propos quel est le serveur FTP utilisé, la version et sur quel plateforme si c'est pas trop indiscret  ?
)
Pour aller plus loin il faut que tu  bidouilles la  fonctions  parseFTPEntry(String entry).
A la fin de celle ci tu remplaces return null;  par  return file;
comme cela le  FTPFile ne sera pas null et tu pourras accéder aux  lignes qui lui pose problèmes par  la fonction
    files[i].getRawListing().
En modifiant prog ainsi

for(int i = 0; i< files.length;i++)



    {



      if  (files[i].getName()== null)



            System.out.println(files[i].getRawListing());



    }


il va te sortir tous les lignes qui n'a pas pu traiter.

Si t'as des problèmes pour modifier cette fonction,contact  moi directement.

Je t'ai mis en dessous la partie du code incriminé tu verras  que si la condition if (matches(entry)) n'est pas rempli elle va te retourner null.

 public FTPFile parseFTPEntry(String entry)
    {

        FTPFile file = new FTPFile();
        file.setRawListing(entry);
        if (matches(entry))
        {
            String usr = group(14);
            String grp = group(15);
            String filesize = group(16);
            String mo = group(17);
            String da = group(18);
            String yr = group(20);
            String hr = group(21);
            String min = group(22);
            String name = group(23);

            file.setType(FTPFile.FILE_TYPE);
            file.setUser(usr);
            file.setGroup(grp);
            try
            {
                file.setSize(Long.parseLong(filesize));
            }
            catch (NumberFormatException e)
            {
                // intentionally do nothing
            }

            Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MILLISECOND, 0);
            cal.set(Calendar.SECOND,
                    0);
            cal.set(Calendar.MINUTE,
                    0);
            cal.set(Calendar.HOUR_OF_DAY,
                    0);
            try
            {

                int pos = MONTHS.indexOf(mo);
                int month = pos / 4;
                if (yr != null)
                {
                    // it's a year
                    cal.set(Calendar.YEAR,
                            Integer.parseInt(yr));
                }
                else
                {
                    // it must be  hour/minute or we wouldn't have matched
                    int year = cal.get(Calendar.YEAR);

                    // if the month we're reading is greater than now, it must
                    // be last year
                    if (cal.get(Calendar.MONTH) < month)
                    {
                        year--;
                    }
                    cal.set(Calendar.YEAR,
                            year);
                    cal.set(Calendar.HOUR_OF_DAY,
                            Integer.parseInt(hr));
                    cal.set(Calendar.MINUTE,
                            Integer.parseInt(min));
                }
                cal.set(Calendar.MONTH,
                        month);
                cal.set(Calendar.DATE,
                        Integer.parseInt(da));
                file.setTimestamp(cal);
            }
            catch (NumberFormatException e)
            {
                // do nothing, date will be uninitialized
            }
            file.setName(name);

            return file;
        }
        return null; //à remplacer par un return file;
    }

 
0
cs_stillfelil Messages postés 108 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 12 septembre 2009 3
15 nov. 2006 à 22:11
Salut Ab2oulem
C'est super sympa,
donc c'est l'exception qui a arretee le listage...
vrement bien vu
le code je ne peut pas le tester ici,je ne suis pas au bureau,et l'access au serveur ftp est limité par ip,
je le testerais samedi (weekend :jeudi,vendredi) quand je rentrerais au bureau
et je tienderais au couran (si tu permet bien sure),
en tout cas super merci pour ton aide, tu ma vrement aidé
a+

oqwtkt fgdwv swg fg xkxtg c igpqwz
0
Rejoignez-nous