[Runtime]attendre fin execution [Résolu]

cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 11 nov. 2006 à 15:46 - Dernière réponse : cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention
- 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
Afficher la suite 

18 réponses

Répondre au sujet
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 11 nov. 2006 à 16:08
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_stillfelil
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 11 nov. 2006 à 16:12
0
Utile
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
Commenter la réponse de cs_stillfelil
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscription 20 avril 2018 Dernière intervention - 11 nov. 2006 à 16:16
0
Utile
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
Commenter la réponse de Twinuts
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 11 nov. 2006 à 16:21
0
Utile
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
Commenter la réponse de cs_stillfelil
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscription 20 avril 2018 Dernière intervention - 11 nov. 2006 à 18:02
0
Utile
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
Commenter la réponse de Twinuts
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 11 nov. 2006 à 18:27
0
Utile
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"
Commenter la réponse de sheorogath
Twinuts 5261 Messages postés dimanche 4 mai 2003Date d'inscription 20 avril 2018 Dernière intervention - 11 nov. 2006 à 19:51
0
Utile
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
Commenter la réponse de Twinuts
sheorogath 2465 Messages postés samedi 21 février 2004Date d'inscription 29 janvier 2010 Dernière intervention - 11 nov. 2006 à 19:56
0
Utile
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"
Commenter la réponse de sheorogath
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 12 nov. 2006 à 08:10
0
Utile
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
Commenter la réponse de cs_stillfelil
ab2oulem 4 Messages postés lundi 13 novembre 2006Date d'inscription 15 novembre 2006 Dernière intervention - 13 nov. 2006 à 18:09
0
Utile
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.
Commenter la réponse de ab2oulem
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 14 nov. 2006 à 08:54
0
Utile
Sa ne merche pas
je vais utiliser le package d'Apache
merci ;-)
oqwtkt fgdwv swg fg xkxtg c igpqwz
Commenter la réponse de cs_stillfelil
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 15 nov. 2006 à 09:23
0
Utile
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
Commenter la réponse de cs_stillfelil
ab2oulem 4 Messages postés lundi 13 novembre 2006Date d'inscription 15 novembre 2006 Dernière intervention - 15 nov. 2006 à 10:07
0
Utile
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)   { }
        }
    }
   
    }

}
 
Commenter la réponse de ab2oulem
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 15 nov. 2006 à 10:28
0
Utile
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
Commenter la réponse de cs_stillfelil
ab2oulem 4 Messages postés lundi 13 novembre 2006Date d'inscription 15 novembre 2006 Dernière intervention - 15 nov. 2006 à 11:41
0
Utile
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 ?

 
Commenter la réponse de ab2oulem
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 15 nov. 2006 à 13:50
0
Utile
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
Commenter la réponse de cs_stillfelil
ab2oulem 4 Messages postés lundi 13 novembre 2006Date d'inscription 15 novembre 2006 Dernière intervention - 15 nov. 2006 à 18:50
0
Utile
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;
    }

 
Commenter la réponse de ab2oulem
cs_stillfelil 108 Messages postés samedi 31 juillet 2004Date d'inscription 12 septembre 2009 Dernière intervention - 15 nov. 2006 à 22:11
0
Utile
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
Commenter la réponse de cs_stillfelil

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.