Jump to content
Sign in to follow this  
tenrev

FTP Download All Folders and Files

Recommended Posts

tenrev

Hi everyone,

I just want to ask help.. I just want to make an autoit program that will download all the file (folders with files and sub folders and files)
im able to do the basic things.. open, connect, get,close.. what i cant do is download files and folders in one code.
 
what i really want to do is doing a backup..
- at first, download all files from the ftp and compress it with file name of date&time
- then next back up would be all the new and modified files (in there respective dir) will be downloaded from ftp then compress it  with filename of date&time
-backup will be done just once a week..
 
hope you can help me..

Share this post


Link to post
Share on other sites
orbs

assuming there is no application already capable of doing it, it seems that recursion of the FTP folders is in order here, so for each FTP file you can compare to local file, so you can determine which file is to be downloaded. you cannot download only changes with one FTP command.

Share this post


Link to post
Share on other sites
EKY32

WELL, "orbs" gave you the main part of the answer but you can still create a small backup script which needs some hard working using_FTP_FindFileFirst ,  _FTP_FindFileNext , or _FTP_ListToArray to identify the files and download them in the order they are on the server.


[font="'trebuchet ms', helvetica, sans-serif;"]Please mark the answer of your question if you found it.[/font]

Share this post


Link to post
Share on other sites
michaelslamet

Download whole file from FTP server just to make a comparation with local file is not a good idea.

You should maintaince a text file in the FTP server contain full path+filename and the file checksum, something like this:

c:myfoldermyfile1.exe=0x75A76530D5FCB63064ADFC5262D5B5B5

c:myfoldermyfile2.exe=0xF4F5F49CC99CFD355F51849036D84D81

So instead of download the full file, you can download just the text file and compare the file checksum against the local file.

To generate the checksum, you can many methods, this is the code for MD5 and CRC32:

; By guinness - 2012-2013.
Func _MD5Hash($sFilePath, $iPercentageRead = Default) ; Default is 100 percent.
    $iPercentageRead = Int($iPercentageRead)
    If ($iPercentageRead > 100) Or ($iPercentageRead < 0) Then
        $iPercentageRead = 100
    EndIf
    Return _Crypt_HashData(FileRead($sFilePath, ($iPercentageRead / 100) * FileGetSize($sFilePath)), $CALG_MD5)
EndFunc   ;==>_MD5Hash

 

; #FUNCTION# ====================================================================================================================
; Name ..........: _CRC32ForFile
; Description ...: Calculates CRC32 value for the specific file.
; Syntax ........: _CRC32ForFile($sFilePath)
; Parameters ....: $sFilePath           - Full path to the file to process.
;                  $iPercentageRead     - [optional] Percentage of file to read. Default is 100.
; Return values .: Success - Returns CRC32 value in the form of a hex string
;                          - Sets @error to 0
;                  Failure - Returns empty string and sets @error:
;                  |1 - CreateFile function or call to it failed.
;                  |2 - CreateFileMapping function or call to it failed.
;                  |3 - MapViewOfFile function or call to it failed.
;                  |4 - RtlComputeCrc32 function or call to it failed.
; Author ........: trancexx
; Modified ......: guinness
; Link ..........: http://www.autoitscript.com/forum/topic/95558-crc32-md4-md5-sha1-for-files/
; Example .......: No
; ===============================================================================================================================
Func _CRC32ForFile($sFilePath, $iPercentageRead = 100)
    $iPercentageRead = Int($iPercentageRead)
    If ($iPercentageRead > 100) Or ($iPercentageRead < 0) Then
        $iPercentageRead = 100
    EndIf
    $iPercentageRead = ($iPercentageRead / 100) * FileGetSize($sFilePath)
    Local $iError = 0
    Local Const $hFilePath = _WinAPI_CreateFileEx($sFilePath, $OPEN_EXISTING, $GENERIC_READ, BitOR($FILE_SHARE_READ, $FILE_SHARE_WRITE), $SECURITY_ANONYMOUS, 0, 0)
    If @error Then
        Return SetError(1, 0, '')
    EndIf

    Local Const $hFilePathMappingObject = _WinAPI_CreateFileMapping($hFilePath, 0, 0, $PAGE_READONLY)
    $iError = @error
    _WinAPI_CloseHandle($hFilePath)
    If $iError Then
        Return SetError(2, 0, '')
    EndIf

    Local Const $pFilePath = _WinAPI_MapViewOfFile($hFilePathMappingObject, 0, $iPercentageRead, $FILE_MAP_READ)
    $iError = @error
    _WinAPI_CloseHandle($hFilePathMappingObject)
    If $iError Then
        Return SetError(3, 0, '')
    EndIf

    Local Const $iBufferSize = $iPercentageRead ; FileGetSize($sFilePath)
    Local Const $iCRC32 = _WinAPI_ComputeCrc32($pFilePath, $iBufferSize)
    $iError = @error
    _WinAPI_UnmapViewOfFile($pFilePath)
    _WinAPI_CloseHandle($hFilePathMappingObject)
    If $iError Then
        Return SetError(4, 0, '')
    EndIf
    Return SetError(0, 0, Hex($iCRC32, 8))
EndFunc   ;==>_CRC32ForFile

 

Thanks to guiness and trancexx for this code :)

Share this post


Link to post
Share on other sites
orbs

and how, pray tell, will this text file be updated with the new checksum when one of the FTP files is modified?

comparison does not need to be by contents; i'd use time stamp or size, which can be compared without downloading the file.

Share this post


Link to post
Share on other sites
michaelslamet

Whatever applications that change those FTP files have to maintain the text file :)

If cant do it that way, dont use this method.

Time stamp or size is another way, but it doesn't bullet proof. If we want to be sure that the file is same/different, we should use file checksum, IMHO.

  • Like 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×