UNE ALTERNATIVE FTP SANS API ET SANS OCX

sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006 - 15 févr. 2004 à 12:47
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006 - 27 mai 2006 à 20:42
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/20445-une-alternative-ftp-sans-api-et-sans-ocx

sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
27 mai 2006 à 20:42
Oui étrange... essaie de déboguer. Mais bon au pire c'est vite corrigé ^^

(moi étant sous Linux depuis je ne saurais plus...)
Cobaille69 Messages postés 2 Date d'inscription jeudi 25 mai 2006 Statut Membre Dernière intervention 27 mai 2006
27 mai 2006 à 19:35
Je ne comprend pas comment ca ne te donne pas d'erreur quand tu écris:

Canal = FreeFile(1)
'ouverture du fichier en écriture s'il n'existe pas il est créé
Open App.Path & "\ScriptFtp.scr" For Output As #Canal
Print #canal2, ScriptFTP
'fermeture du fichier
Close canal2

Vraiment, c'est étrange pcq normalement il essayerait d'ouvrir le fichier #0. Quelqu'un a une idée?
dam1234 Messages postés 14 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 20 juillet 2005
20 juil. 2005 à 08:51
Oki oki probleme resolu, je ne suis pas sur de la raison mais je pense que lors de l'execution par Shell VB je ne mettais pas les -n -i pour les options de ftp et cela posait apparemment probleme enfin merci de ta reponse man.
dam1234 Messages postés 14 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 20 juillet 2005
20 juil. 2005 à 08:38
C'est ce que je pensais aussi ; un espace je veux bien mais je vois pas ou du tout puisque comme je l'ai dit precedemment le script lance est le meme... Je vais encore jete un coup d 'oeil si je ne vois pas d'erreurs. Merci quand meme de ton aide peut etre est ce la solution
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
19 juil. 2005 à 19:15
je vois pas le probleme... honnettement tu dois avoir un espace ou qqch comme ca, non?
dam1234 Messages postés 14 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 20 juillet 2005
19 juil. 2005 à 16:44
Je précise également qu'étrangement si je fais une sortie des cmds dans un fichier, le script lance depuis DOS donne un truc du type
ftp>connect blablaftp
open blablaftp 8021 (le port ke je desire)
220 blablaftp server ... ready
ftp>user moi monpass
331 pwd required
230 login successfull
et les commandes s enchainent sans problemes
alors que lorsque le script est lance par le shell vb ca donne
ftp>connect blaftp
open blaftp 8021
220 blaftp server ... ready
utilisateur(blaftp:(none)ÿ: (cette ligne je ne se pa ce k c et le 'ÿ' me semble louche)
331 pwd required
(la je ne se pas pkoi mais j'ai une ligne vide!)
230 login successfull
ftp> commande non valide
et la aucune commande ne fonctionne. Deja le user /password n'apparait pas est-ce normal?

Je tiens a preciser que ces 2 sorties ont pour source le MEME script alors je ne comprends pas...
dam1234 Messages postés 14 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 20 juillet 2005
19 juil. 2005 à 15:22
Bonjour je me retrouve face a un probleme lors de l'execution de ce script. En fait lorsque j'execute le script en tapant directement la ligne de commande dans une fenetre DOS aucun souci, tout fonctionne mais lorsque je fais executer le script par l'intermediaire de code VB avec la fonction Shell, alors rien ne se passe et le code d 'erreur renvoyé est un depassement de capacite (6)... J'utilise XL 97 et ouiouin 98 et malgré mes recherches je ne vois vraiment pas d'ou peut provenir le hic, quelqu'un a t il une idee? Merci d'avance a tous
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
9 juin 2005 à 13:58
Effectivement MSINET.OCX ne fonctionne que sur un poste de développement (VB6 doit être installé), et ce script fonctionne à merveille sur un poste simple, bravo. J'ai même simplifié à l'extrême le script :
Open ftpperso.free.fr
User Login pw
Binary
mput C:\tmp\Test.txt
bye
exit

Ya juste un truc qui ne fonctionne pas, c'est le rapport TransFtp.Log, pourtant il fonctionne quand je tape exactement la même commande directement dans une fenêtre DOS. Quelqu'un a une idée ? (de toute façon j'ai le code de retour avec mon ShellWait, pas vraiment besoin du rapport)
2 bugs à signaler : ResultatCommande est un long et nom un byte, et ajouter & vbCrLf après le mot de passe dans la dernière remarque.
tousdom Messages postés 1 Date d'inscription mercredi 29 janvier 2003 Statut Membre Dernière intervention 23 juin 2004
23 juin 2004 à 15:29
Le source est bon mais il y a deux petits bugs

à la ligne 1 il faut ajouter un espace après l'Open
ScriptFTP = "Open " & NomServeur & vbCrLf

à la ligne 2 il faut ajouter la commande user du ftp
ScriptFTP = ScriptFTP & "User " & NomUtilisateur & " " & MotDePasse

Sous Windows 2000 ou XP il est préférable d'intégrer le chemin de l'application dans le shell :

ResultatCommande = Shell("command.com /c ftp -n -i -s:" & App.Path & "ScriptFtp.scr", vbNormalFocus)
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
19 avril 2004 à 11:32
Beaucoup plus simple:

Dim monProcessusFTP() As Process
ResultatCommande = Shell(Environ$("comspec") & " /c ftp -s:" & Environ("windir") & "\ScriptFTP.scr , AppWinStyle.Hide)
monProcessusFTP = Process.GetProcessesByName("ftp")
For Each p As Process In monProcessusFTP
p.WaitForExit()
Next

ca fonctionne, c'est simple, discret
je vais tester sous windows 98, mais j'ai meme pas peur...

ciao. @+
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
19 avril 2004 à 11:30
Beaucoup plus simple:

Dim monProcessusFTP() As Process
ResultatCommande = Shell(Environ$("comspec") & " /c ftp -s:" & Environ("windir") & "\ScriptFTP.scr , AppWinStyle.Hide)
monProcessusFTP = Process.GetProcessesByName("ftp")
For Each p As Process In monProcessusFTP
p.WaitForExit()
Next

ca fonctionne, c'est simple, discret
je vais tester sous windows 98, mais j'ai meme pas peur...

ciao. @+
capuccino_fr Messages postés 113 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 11 février 2008
19 avril 2004 à 10:55
perso, ca marche pas. je sais pas si ce sont les codes... :-(
je suis sous winXP avec VB.NET
cs_Xax Messages postés 16 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 18 août 2011
18 févr. 2004 à 09:13
Effectivement ma question était celle la.

c pas con du tout le coups de la boucle, je garde ca sous le coude.

merci bien pour l'info...

@ bientot & bon courage !!
cs_Multiprise Messages postés 63 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 23 avril 2013
18 févr. 2004 à 06:31
Désolé Xas je n'ai pas été attentif et j'ai fait un copier collé sans m'apercevoir qu'il y avoit des lignes sans intérêt.
Ci-dessous la correction de la procédure.

'Procédure qui permet de lancer une tache et d'attendre que celle-ci
'soit terminée avant que le programme initial reprenne la main
Public Sub ExecCmd(strCmdline As String, Etat As Byte)
Const PROCESS_ACTIF = &H103&
Const PROCESS_QUERY_INFORMATION = &H400
Dim lngREt As Long
Dim processID As Long
Dim ProcessHandle As Long
Dim lExitCode As Long
'
On Error GoTo Err_ExecCmd
'exécute le process (programme que l'on veut lancer)
processID = Shell(strCmdline, Etat)
'processId est l'identifiant du process que l'on vient d'exécuter
ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, True, processID)
Do
' Retourne le status du processus en cours
'(si lExitCode =&h103 le process est actif)
GetExitCodeProcess ProcessHandle, lExitCode
' Les 2 lignes suivantes sont utile pour éviter de faire
' boucler le système en continu avec GetExitCodeProcess
DoEvents
'Temps de latence en millisecondes
Sleep 500
'on boucle temps que Getexitcode nous renvoi le process comme actif
Loop While lExitCode = PROCESS_ACTIF
CloseHandle (ProcessHandle)
Exit_ExecCmd:
Exit Sub

Err_ExecCmd:
MsgBox "ExecCmd" & " Erreur N°" & Err.Number & " => " & Err.Description
Resume Exit_ExecCmd

End Sub
cs_Multiprise Messages postés 63 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 23 avril 2013
18 févr. 2004 à 06:21
Salut Xas je pense que ta question était de pouvoir exécuter un logiciel, et d'attendre que ce dernier soit terminé pour que ton programme reprenne le contrôle. La réponse se trouve Ci-dessous:

'A mettre dans un Module :
'Déclarations des fonctions API Shell and Wait Permet d'exécuter une ligne de commande
'et d 'attendre la fermeture de l'application avant de poursuivre.
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
'Api de temporisation, met le système en sommeil(presque) pour un temps défini en millisecondes.
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'

'Procédure qui permet de lancer une tache et d'attendre que celle-ci
'soit terminée avant que le programme initial reprenne la main
Public Sub ExecCmd(strCmdline As String, Etat As Byte)
Const PROCESS_ACTIF = &H103&
Const PROCESS_QUERY_INFORMATION = &H400
Dim lngREt As Long
Dim processID As Long
Dim ProcessHandle As Long
Dim lExitCode As Long
'
On Error GoTo Err_ExecCmd
Screen.MousePointer = vbHourglass
'exécute le process (programme que l'on veut lancer)
processID = Shell(strCmdline, Etat)
'processId est l'identifiant du process que l'on vient d'exécuter
ProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION, True, processID)
Occupe = True
Do
' Retourne le status du processus en cours
'(si lExitCode =&h103 le process est actif)
GetExitCodeProcess ProcessHandle, lExitCode
' Les 2 lignes suivantes sont utile pour éviter de faire
' boucler le système en continu avec GetExitCodeProcess
DoEvents
'Temps de latence en millisecondes
Sleep 500
'on boucle temps que Getexitcode nous renvoi le process comme actif
Loop While lExitCode = PROCESS_ACTIF
CloseHandle (ProcessHandle)
Form1.MousePointer = vbDefault
Occupe = False
If Etat > 0 Then MsgBox "Transferts Terminés.."
Exit_ExecCmd:
Exit Sub

Err_ExecCmd:
'MsgBox "ExecCmd" & " Erreur N°" & Err.Number & " => " & Err.Description
Resume Exit_ExecCmd

End Sub


'Dans une Procédure on exécute la ligne de commande (identique à la Cmd Shell)
'Dans ce cas c'est pour exécuter un script Ftp
Call ExecCmd("command.com /c ftp -n -i -s:" & "Import_Fichiers.spt", 1)
'Mais pour un programme c'est identique
Call ExecCmd("c:\MonRepertoire\UnProgramme.exe",1)
cs_Xax Messages postés 16 Date d'inscription mercredi 27 février 2002 Statut Membre Dernière intervention 18 août 2011
16 févr. 2004 à 23:32
Salut, j'ai une petite question :

j'avais utiliser une methode a peu près identique, je lancais une commande ftp avec un script grace a la classe process. je redirigais la sortie standard du process pour pouvoir analyser les résultats...
jusque la pas de problème, en mode débuggage ca passait nikel, par contre quand je lancais l'exe compilé (hors visual studio), le transfert ce faisait correctement mais mon exe n'attendais plus que la commande soit finit. je ne pouvais donc plus savoir si tout c'était bien déroulé.

a tu essayer en mode compiler ??

@++ Xax

ps : si oui et si ca passe mille merci
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
16 févr. 2004 à 15:39
Ah oui bien vu...command.com existe toujours...
désolé de pas avoir vérifier avant de dire n'importe quoi...
cs_Multiprise Messages postés 63 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 23 avril 2013
15 févr. 2004 à 19:09
Désolé de te contredire mais Command.com existe toujours sous NT/Xp et même sous xp serveur. Quant à la commande exécutée deux fois, le but était simplement de montrer qu'il était possible de rediriger le résultat soit dans une fenêtre MsDos, soit dans un fichier.
Merci pour ton commentaire constructif et pertinent..
sibi12 Messages postés 337 Date d'inscription jeudi 19 décembre 2002 Statut Membre Dernière intervention 15 avril 2006
15 févr. 2004 à 12:47
Bel exemple d'utilisation des commandes dos...et bien commenté

juste qque petite suggestion suggestion :

- sous NT/XP command.com n'existe plus mais c'est cmd.exe donc le programme peut renvopyer une erreur.

- Au lieu d'executer 2 fois la même commande, redirige la premiere dans un fichier et puis utilise la commande type qui te permet d'affciher ce fichier

Voilà je te met quand même un petit 9 pour les commentaires et tout et tout

@+