Vérifier la présence d'un fichier local sur un ftp [Résolu]

Messages postés
31
Date d'inscription
mercredi 9 mars 2005
Dernière intervention
27 novembre 2014
-
Bonjour,
Avec mon code ça fonctionne par contre dès qu'il trouve un fichier absent sur le ftp tout les fichiers en local qui suivent sont vu comme absent même si ce n'est pas le cas jusqu'au dernier fichier testé.


Dim di As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(localpath)
For Each fi As System.IO.FileInfo In di.GetFiles
BackgroundWorker3.ReportProgress(0, fi.ToString & " en test...")
Threading.Thread.Sleep(10)
Dim monCheck As String = fi.ToString
Dim request As FtpWebRequest = WebRequest.Create(baseUri1 & "/" & monCheck)
request.Credentials = New NetworkCredential(Login, Password)
request.Method = WebRequestMethods.Ftp.GetFileSize
Dim response As FtpWebResponse
response = Nothing
Try
response = request.GetResponse()
'Dim MaRep = response.ContentLength
'MsgBox(MaRep)
' THE FILE EXISTS
response.Close()

Catch ex As WebException
Dim errorResponse As FtpWebResponse = ex.Response
If FtpStatusCode.ActionNotTakenFileUnavailable = errorResponse.StatusCode Then
' THE FILE DOES NOT EXIST
BackgroundWorker3.ReportProgress(0, monCheck & " en trop...")
MsgBox(localpath & monCheck & vbLf & "Va être supprimé !!!")
'My.Computer.FileSystem.DeleteFile(localpath & monCheck)
fi = Nothing

End If
ex = Nothing
Finally
request.Abort()
request = Nothing

End Try

monCheck = ""
Next

Merci par avance pour vos lumières...
Afficher la suite 

9 réponses

Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
0
Merci
Bonjour,
à lire attentivement :
http://msdn.microsoft.com/en-us/library/fk6t46tz.aspx
s'attarder sur les conséquences de ce que tu as écrit dans "Finally", qui intervient toujours (exception ou pas).
raynald31
Messages postés
31
Date d'inscription
mercredi 9 mars 2005
Dernière intervention
27 novembre 2014
-
oui mais peu importe même si je le retire ça ne change pas
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
Bonjour
mets ton BackgroundWorker3.ReportProgress(0, fi.ToString & " en test...") en commentaires
et lance avec le debugger pour analyser ce qui se passe
Messages postés
31
Date d'inscription
mercredi 9 mars 2005
Dernière intervention
27 novembre 2014
0
Merci
j'ai le même résultat
Messages postés
31
Date d'inscription
mercredi 9 mars 2005
Dernière intervention
27 novembre 2014
0
Merci
Ce qui se passe c'est que le ftp retourne une erreur 550 au premier fichier non trouvé et qu'ensuite pour tout les autres fichiers, qu'ils existent ou pas sur le ftp, une erreur 550
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
d'accord mets un point d'arrêt à la ligne
Dim errorResponse As FtpWebResponse = ex.Response


lance ton prog,il va s'arreter avec erreur ftp 550
continue pas à pas F11

au faite pourquoi cette ligne ?
 fi = Nothing
Messages postés
31
Date d'inscription
mercredi 9 mars 2005
Dernière intervention
27 novembre 2014
0
Merci
en fait je crois qu'a la première connexion je suis en binary mode ensuite ça passe en ACSII mode car j'ai ce message quand il veut check au fichier suivant
550 SIZE not allowed in ASCII mode
Messages postés
31
Date d'inscription
mercredi 9 mars 2005
Dernière intervention
27 novembre 2014
0
Merci
le fi = Nothing ne sert pas a grand chose, je l'ai supprimé
Messages postés
3244
Date d'inscription
jeudi 26 novembre 2009
Dernière intervention
13 décembre 2018
0
Merci
c'est mieux d'écrire une fonction qui verifie la présence du fichier
et appeler cette fonction dans une boucle

Public Function CheckIfFtpFileExists(ByVal fileUri As String) As Boolean
Dim request As FtpWebRequest = WebRequest.Create(fileUri)
request.Credentials = New NetworkCredential("username", "password")
request.Method = WebRequestMethods.Ftp.GetFileSize
Try
Dim response As FtpWebResponse = request.GetResponse()
' THE FILE EXISTS
Catch ex As WebException
Dim response As FtpWebResponse = ex.Response
If FtpStatusCode.ActionNotTakenFileUnavailable = response.StatusCode Then
' THE FILE DOES NOT EXIST
Return False
End If
End Try
Return True

end function


Dim di As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(localpath)
Dim monCheck As String
For Each fi As System.IO.FileInfo In di.GetFiles
monCheck = fi.ToString
if not CheckIfFtpFileExists(baseUri1 & "/" & monCheck) then
messagebox.show("file will be deleted")
end if



basé sur ce site
http://www.codeproject.com/Tips/163632/How-to-check-if-a-file-exists-on-an-FTP-server
raynald31
Messages postés
31
Date d'inscription
mercredi 9 mars 2005
Dernière intervention
27 novembre 2014
-
oui je faisais avec cette source mais le problème vient du ftp qui ne tolère pas.
Merci pour vos réponses
Messages postés
31
Date d'inscription
mercredi 9 mars 2005
Dernière intervention
27 novembre 2014
0
Merci
finalement j'ai changé de méthode en listant le contenu du local et du ftp et avec un boolean je passe a true si il y a une concordance.
Finalement bien plus simple...


Private Shared Function GetDirectoryListing(uri As String, credentials As ICredentials) As IList(Of String)
Dim entries As New List(Of String)()
Dim request = DirectCast(WebRequest.Create(uri), FtpWebRequest)
If credentials IsNot Nothing Then
request.Credentials = credentials
End If
request.Method = WebRequestMethods.Ftp.ListDirectoryDetails

Using response = DirectCast(request.GetResponse(), FtpWebResponse),
stream = response.GetResponseStream(),
reader = New StreamReader(stream)

Dim line As String = reader.ReadLine()
While line IsNot Nothing
entries.Add(line)
line = reader.ReadLine()
End While
Return entries

End Using

End Function



Dim wc As New WebClient()
wc.Credentials = New NetworkCredential(Login, Password)
Dim baseUri1 = "ftp://monftp....."
Dim fileNames1 = GetDirectoryListing(baseUri1, wc.Credentials)

Dim di As System.IO.DirectoryInfo = New System.IO.DirectoryInfo(localpath)
For Each fi As System.IO.FileInfo In di.GetFiles
BackgroundWorker3.ReportProgress(0, fi.ToString & " en test...")
Threading.Thread.Sleep(100)
Dim monCheck As String = fi.ToString
Dim checkOk As Boolean = False
For Each fileName In fileNames1

If (fileName.StartsWith("-")) Then
Dim Monsplit1 = Split(fileName, " ")(UBound(Split(fileName, " ")))
If monCheck = Monsplit1 Then
checkOk = True
End If
End If
Next
If checkOk = True Then
BackgroundWorker3.ReportProgress(0, monCheck & " est OK")
Else
BackgroundWorker3.ReportProgress(0, monCheck & " en trop...")
'MsgBox(localpath & monCheck & vbLf & "Va être supprimé !!!")
My.Computer.FileSystem.DeleteFile(localpath & monCheck)
Threading.Thread.Sleep(100)
End If
Next

End Sub

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.