Vérifier la présence d'un fichier local sur un ftp

Résolu
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014 - Modifié par raynald31 le 26/11/2014 à 18:28
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014 - 27 nov. 2014 à 11:51
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...

9 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
26 nov. 2014 à 19:05
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).
0
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014
26 nov. 2014 à 20:10
oui mais peu importe même si je le retire ça ne change pas
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 nov. 2014 à 21:09
Bonjour
mets ton BackgroundWorker3.ReportProgress(0, fi.ToString & " en test...") en commentaires
et lance avec le debugger pour analyser ce qui se passe
0
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014
26 nov. 2014 à 22:06
j'ai le même résultat
0
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014
26 nov. 2014 à 22:57
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
0

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

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
26 nov. 2014 à 23:50
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
0
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014
27 nov. 2014 à 00:23
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
0
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014
27 nov. 2014 à 00:30
le fi = Nothing ne sert pas a grand chose, je l'ai supprimé
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
27 nov. 2014 à 10:27
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
0
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014
Modifié par raynald31 le 27/11/2014 à 11:51
oui je faisais avec cette source mais le problème vient du ftp qui ne tolère pas.
Merci pour vos réponses
0
raynald31 Messages postés 31 Date d'inscription mercredi 9 mars 2005 Statut Membre Dernière intervention 27 novembre 2014
Modifié par raynald31 le 27/11/2014 à 10:34
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

0
Rejoignez-nous