[R] Téléchargement FTP et fichiers temporaires

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Faco
Niveau 4
Niveau 4
Messages : 80
Enregistré le : lun. 29 juil. 2013 18:09
Status : Hors ligne

[R] Téléchargement FTP et fichiers temporaires

#1

Message par Faco »

Bonjour les autoitciens,

J'ai fais un petit programme ça fait un bout de temps qui me permet de télécharger des programmes/fichiers que j'ai centralisé sur un ftp.
J'utilise principalement la fonction "_FTP_ProgressDownload" pour avoir le visu de ce qu'il ce passe :-) .
Mon programme fonctionne mais, j'ai un petit problème quand même.

Quand je lance le programme et qu'il va télécharger mes fichiers, il crée dans C:\Users\<USER>\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5 une série de dossiers dans lesquels il y a des fichiers qui porte le nom de ce que je vais/veux télécharger.
Ces fichiers/dossiers ne sont pas supprimés à la fin du programme.
Du coup, si je modifie mes fichiers sur le FTP et que je relance mon programme, il n’écrase pas les fichiers présent dans C:\Users\<USER>\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5 et il essaye de télécharger les anciens fichiers du FTP (qui ne sont plus là vu que j'ai modifier mon FTP :-) ) et pas les nouveaux.

Je le sais, donc c'est pas trop gênant, je vais supprimer les fichiers temporaires. Mais j'aimerai me faire une petite tâche planifiée ce DL.

Donc, vous savez comment je les zap/écrase ou je fais un scan avant DL, scan après DL et suppr la différence.

Merci ++
Modifié en dernier par Faco le jeu. 24 mars 2016 19:56, modifié 1 fois.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..]Téléchargement FTP et fichiers temporaires

#2

Message par orax »

Bonjour, comme alternative on devrait pouvoir lui dire de ne pas télécharger depuis le cache local. Est-ce que ça peut correspondre à tes besoins ?
(Je ne sais pas si ça marche.)
Func _FTP_ProgressDownload2($hFTPSession, $sLocalFile, $sRemoteFile, $hFunctionToCall = 0)
   If $__g_hWinInet_FTP = -1 Then Return SetError(-2, 0, 0)

   Local $hFile = FileOpen($sLocalFile, $FO_OVERWRITE + $FO_BINARY)
   If $hFile < 0 Then Return SetError(-1, 0, 0)

; ajout de => + $INTERNET_FLAG_RELOAD
   Local $ai_FtpOpenfile = DllCall($__g_hWinInet_FTP, 'handle', 'FtpOpenFileW', 'handle', $hFTPSession, 'wstr', $sRemoteFile, 'dword', $GENERIC_READ, 'dword', $FTP_TRANSFER_TYPE_BINARY + $INTERNET_FLAG_RELOAD, 'dword_ptr', 0)
   If @error Or $ai_FtpOpenfile[0] = 0 Then Return SetError(-3, _WinAPI_GetLastError(), 0)

   Local $ai_FTPGetFileSize = DllCall($__g_hWinInet_FTP, 'dword', 'FtpGetFileSize', 'handle', $ai_FtpOpenfile[0], 'dword*', 0)
   If @error Then Return SetError(-2, _WinAPI_GetLastError(), 0)

   If Not IsFunc($hFunctionToCall) Then ProgressOn("FTP Download", "Downloading " & $sLocalFile)

   Local $iLen = _WinAPI_MakeQWord($ai_FTPGetFileSize[0], $ai_FTPGetFileSize[2]) ;FileGetSize($sRemoteFile)
   Local Const $iChunkSize = 256 * 1024
   Local $iLast = Mod($iLen, $iChunkSize)

   Local $iParts = Ceiling($iLen / $iChunkSize)
   Local $tBuffer = DllStructCreate("byte[" & $iChunkSize & "]")

   Local $aDone, $ai_FTPread, $iOut, $iRet, $iLasterror
   Local $x = $iChunkSize
   Local $iDone = 0
   For $i = 1 To $iParts
      If $i = $iParts And $iLast > 0 Then
         $x = $iLast
      EndIf

      $ai_FTPread = DllCall($__g_hWinInet_FTP, 'bool', 'InternetReadFile', 'handle', $ai_FtpOpenfile[0], 'struct*', $tBuffer, 'dword', $x, 'dword*', $iOut)
      If @error Or $ai_FTPread[0] = 0 Then
         $iLasterror = _WinAPI_GetLastError()
         $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0])
         ; No need to test @error.
         FileClose($hFile)
         If Not IsFunc($hFunctionToCall) Then ProgressOff()
         Return SetError(-4, $iLasterror, 0)
      EndIf
      $iRet = FileWrite($hFile, BinaryMid(DllStructGetData($tBuffer, 1), 1, $ai_FTPread[4]))
      If Not $iRet Then
         $iLasterror = _WinAPI_GetLastError()
         $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0])
         ; No need to test @error.
         FileClose($hFile)
         FileDelete($sLocalFile)
         If Not IsFunc($hFunctionToCall) Then ProgressOff()
         Return SetError(-7, $iLasterror, 0)
      EndIf
      $iDone += $ai_FTPread[4]

      If Not IsFunc($hFunctionToCall) Then
         ProgressSet(($iDone / $iLen) * 100)
      Else
         $iRet = $hFunctionToCall(($iDone / $iLen) * 100)
         If $iRet <= 0 Then
            $iLasterror = @error
            $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0])
            ; No need to test @error.
            FileClose($hFile)
            FileDelete($sLocalFile)
            If Not IsFunc($hFunctionToCall) Then ProgressOff()
            Return SetError(-6, $iLasterror, $iRet)
         EndIf
      EndIf
      Sleep(10)
   Next

   FileClose($hFile)

   If Not IsFunc($hFunctionToCall) Then ProgressOff()

   $aDone = DllCall($__g_hWinInet_FTP, 'bool', 'InternetCloseHandle', 'handle', $ai_FtpOpenfile[0])
   If @error Or $aDone[0] = 0 Then
      Return SetError(-5, _WinAPI_GetLastError(), 0)
   EndIf

   Return 1
EndFunc   ;==>_FTP_ProgressDownload2
https://msdn.microsoft.com/fr-fr/librar ... 85%29.aspx

Remarque : j'ai créé une nouvelle fonction. NE PAS modifier l'UDF original !
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Faco
Niveau 4
Niveau 4
Messages : 80
Enregistré le : lun. 29 juil. 2013 18:09
Status : Hors ligne

Re: [..]Téléchargement FTP et fichiers temporaires

#3

Message par Faco »

Pas mal ça, et simple. Pas pensé à fouiller dans l'udf.

Je test demain,

merci.
Faco
Niveau 4
Niveau 4
Messages : 80
Enregistré le : lun. 29 juil. 2013 18:09
Status : Hors ligne

Re: [..] Téléchargement FTP et fichiers temporaires

#4

Message par Faco »

Merci orax,
c'était pas tout à fais ça mais j'avais mal identifié le problème et j'ai trouvé grâce à toi.

Le problème ne venais pas du _FTP_ProgressDownload mais de _FTP_ListToArray et _FTP_ListToArray a comme flag $INTERNET_FLAG_RELOAD :-).

merci beaucoup.

[R] !!!
Répondre