[AccessD] Transferring Files via FTP

David Emerson newsgrps at dalyn.co.nz
Fri Oct 9 04:15:19 CDT 2020


So I should ignore the ping test and work on why the ListFTPFiles function
is not returning any files?

-----Original Message-----
From: AccessD <accessd-bounces at databaseadvisors.com> On Behalf Of Stuart
McLachlan
Sent: Friday, 9 October 2020 10:09 pm
To: Access Developers discussion and problem solving
<accessd at databaseadvisors.com>
Subject: Re: [AccessD] Transferring Files via FTP

They are blocking PINGs so  a PING test won't work for that site.

However I was able to connect to that host using SFTP through  WInSCP. on
Port 22

On 9 Oct 2020 at 21:08, David Emerson wrote:

> Spoke too soon.  Now the Ping message is:
> 
> Pinging 143.96.3.34 with 32 bytes of data:
> Request timed out.
> 
> Ping statistics for 143.96.3.34:
>     Packets: Sent = 1, Received = 0, Lost = 1 (100% loss),
> 
> I have increased the wait time to 60 seconds but still with the same 
> result.
> 
> 
> Here is the ping command:
> C:\Windows\system32\cmd.exe /c ping 143.96.3.34 -n 1 -w 60000 > 
> "C:\aaTemp\pingtest.txt"
> 
> However, I cannot connect with FileZilla using the IP Address.  It 
> only seems to work with sftp://sftp.electricityregistry.co.nz (and 
> connects within a couple of seconds).
> 
> In summary,
> Pinging the server name gets: Ping request could not find host 
> sftp://sftp.electricityregistry.co.nz.
> Pinging the server IP gets: Request timed out.
> Connecting via FileZilla using the server name (and login) works.
> 
> What is my code missing?
> 
> Regards
> 
> David Emerson
> Dalyn Software Ltd
> Wellington, New Zealand
> 
> 
> 
> -----Original Message-----
> From: AccessD <accessd-bounces at databaseadvisors.com> On Behalf Of 
> David Emerson Sent: Friday, 9 October 2020 8:34 pm To: 'Access 
> Developers discussion and problem solving'
> <accessd at databaseadvisors.com> Subject: Re: [AccessD] Transferring 
> Files via FTP
> 
> Hi Stuart (and others),
> 
> I am working on your code below.  I am initially checking that I can 
> ping to the server using the InternetOK() function but I am getting an
> error: Ping request could not find host 
> sftp://sftp.electricityregistry.co.nz. Please check the name and try 
> again.
> 
> Here is my modified Code (without error coding):
> 
> Function InternetOK() As Boolean
> 
>     Dim strTemp As String, strExe As String, ff As Long
> 
>     strExe = Environ$("COMSPEC")
>     strExe = Left$(strExe, Len(strExe) - Len(Dir(strExe)))
> 
>     strExe = Environ("COMSPEC") & " /c "
>     strExe = strExe & "ping sftp://sftp.electricityregistry.co.nz -n 1
>     > """
> & TempDir() & "pingtest.txt"""
>     ShellWait strExe, vbHide
> 
>     Debug.Print strExe
>     ff = FreeFile
>     Open TempDir() & "pingtest.txt" For Input As #ff
>     Line Input #ff, strTemp
>     Close #ff
>     If InStr(strTemp, "Ping request could not find host") > 0 Then
>         InternetOK = False
>     Else
>         InternetOK = True
>     End If
> 
> End Function
> 
> I am able to connect using FileZilla.  But this includes a login and 
> password.
> 
> Can anyone suggest what I am doing wrong?
> 
> Regards
> 
> David Emerson
> Dalyn Software Ltd
> Wellington, New Zealand
> 
> 
> 
> -----Original Message-----
> From: AccessD <accessd-bounces at databaseadvisors.com> On Behalf Of 
> Stuart McLachlan Sent: Wednesday, 6 May 2020 11:42 am To: Access 
> Developers discussion and problem solving 
> <accessd at databaseadvisors.com> Subject: Re: [AccessD] Transferring 
> Files via FTP
> 
> Heres' a  modFTP from an old application of mine which uses the built 
> in Windows FTP client and an FTP script generated "on the fly".  It 
> will need PTRSAFE, LONGPTR etc modifications for Officer 64bit.
> 
> (These days, I  SHELL to my own applicationa written in PowerBASIC for 
> all FPT processes)
> 
> 
> Option Explicit
> Option Compare Database
> 
> Private Const STARTF_USESHOWWINDOW& = &H1 Private Const 
> NORMAL_PRIORITY_CLASS = &H20& Private Const INFINITE = -1&
> 
> Public g_strFTPPutList() As String
> 
> Private Type STARTUPINFO
>     cb As Long
>     lpReserved As String
>     lpDesktop As String
>     lpTitle As String
>     dwX As Long
>     dwY As Long
>     dwXSize As Long
>     dwYSize As Long
>     dwXCountChars As Long
>     dwYCountChars As Long
>     dwFillAttribute As Long
>     dwFlags As Long
>     wShowWindow As Integer
>     cbReserved2 As Integer
>     lpReserved2 As Long
>     hStdInput As Long
>     hStdOutput As Long
>     hStdError As Long
> End Type
> 
> Private Type PROCESS_INFORMATION
>     hProcess As Long
>     hThread As Long
>     dwProcessID As Long
>     dwThreadID As Long
> End Type
> 
> Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As 
> Long, ByVal dwMilliseconds As Long) As Long
> 
> Declare Function CreateProcessA Lib "kernel32" (ByVal 
> lpApplicationName As Long, ByVal lpCommandLine As String, ByVal 
> lpProcessAttributes As Long, ByVal lpThreadAttributes As Long, ByVal 
> bInheritHandles As Long, ByVal dwCreationFlags As Long, ByVal 
> lpEnvironment As Long, ByVal lpCurrentDirectory As Long, lpStartupInfo 
> As STARTUPINFO, lpProcessInformation As PROCESS_INFORMATION) As Long
> 
> Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As 
> Long
> 
> Public Sub ShellWait(Pathname As String, Optional WindowStyle As Long) 
> On Error GoTo Err_Handler
> 
>    Dim proc As PROCESS_INFORMATION
>    Dim start As STARTUPINFO
>    Dim ret As Long
> 
>    ' Initialize the STARTUPINFO structure:
>    With start
>       .cb = Len(start)
>       If Not IsMissing(WindowStyle) Then
>          .dwFlags = STARTF_USESHOWWINDOW
>          .wShowWindow = WindowStyle
>       End If
>    End With
>    ' Start the shelled application:
>    ret& = CreateProcessA(0&, Pathname, 0&, 0&, 1&,
>    NORMAL_PRIORITY_CLASS,
> 0&, 0&, start, proc)
>    ' Wait for the shelled application to finish:
>    ret& = WaitForSingleObject(proc.hProcess, INFINITE)
>    ret& = CloseHandle(proc.hProcess)
> 
> Exit_Here:
>    Exit Sub
> Err_Handler:
>    MsgBox Err.Description, vbExclamation, "E R R O R"
>    Resume Exit_Here
> 
> End Sub
> 
> 
> 'Following functions look for Site, Login, PW in table usysWeb 
> Function ListFTPFiles(Directory As String) As Variant Const q As 
> String * 1 = """" Dim sEXE As String Dim strList As String Dim
> strFIles() As String Dim x As Long Dim ff As Long strList = TempDir() 
> & "FTPCmds.tmp" ff = FreeFile Open strList For Output As #ff Print 
> #ff, "open " & DLookup("Site", "usysWEB") Print #ff, DLookup("Login",
> "usysWEB") Print #ff, DLookup("PW", "usysWEB") Print #ff, "cd " & 
> Directory Print #ff, "ls . " & TempDir() & "\" & "webfiles.txt" Print 
> #ff, "bye" Close #ff sEXE = Environ$("COMSPEC") sEXE = Left$(sEXE,
> Len(sEXE) - Len(Dir(sEXE))) sEXE = sEXE & "ftp.exe -s:" & q & strList 
> & q ShellWait sEXE, vbHide Kill strList ff = FreeFile Open TempDir() & 
> "webfiles.txt" For Input As #ff While Not EOF(ff)
>    x = x + 1
>    ReDim Preserve strFIles(x)
>    Line Input #1, strFIles(x)
> Wend
> Close #ff
> 'Kill TempDir() & "webfiles.txt"
> ListFTPFiles = strFIles()
> End Function
> 
> Function FTPPut(Directory As String, Filename As String) As Boolean 
> Const q As String * 1 = """" Dim strExe As String Dim strLocalDir As 
> String Dim strFName As String Dim strList As String Dim ff As Long If
> Dir(Filename) = "" Then
>    MsgBox Filename & " not found!"
>    Exit Function
> End If
> strLocalDir = Left$(Filename, InStrRev(Filename, "\") - 1) If
> Len(strLocalDir) = 2 Then strLocalDir = strLocalDir & "\"
> strFName = Mid$(Filename, InStrRev(Filename, "\") + 1) strList =
> TempDir() & "FTPCmds.tmp" ff = FreeFile Open strList For Output As #ff 
> Print #ff, "open " & DLookup("Site", "usysWEB") Print #ff, 
> DLookup("Login", "usysWEB") Print #ff, DLookup("PW", "usysWEB") Print 
> #ff, "cd " & Directory Print #ff, "lcd " & q & strLocalDir & q Print 
> #ff, "binary" Print #ff, "put " & q & strFName & q Print #ff, "bye"
> Close #ff strExe = Environ$("COMSPEC") strExe = Left$(strExe,
> Len(strExe) - Len(Dir(strExe))) strExe = strExe & "ftp.exe -s:" & q & 
> strList & q ShellWait strExe, vbHide 'vbNormalFocus 'Kill strList End 
> Function
> 
> Function FTPGet(Filename As String, LocalDirectory As String) As 
> Boolean Const q As String * 1 = """" Dim strExe As String Dim 
> strFTPDir As String Dim strFName As String Dim strList As String Dim 
> ff As Long If Dir(LocalDirectory, vbDirectory) = "" Then
>    MsgBox LocalDirectory & " not found"
>    Exit Function
> End If
> strFTPDir = Left$(Filename, InStrRev(Filename, "/")) strFName = 
> Mid$(Filename, InStrRev(Filename, "/") + 1) strList = TempDir() & 
> "FTPCmds.tmp" ff = FreeFile Open strList For Output As #ff Print #ff, 
> "open " & DLookup("Site", "usysWEB") Print #ff, DLookup("Login",
> "usysWEB") Print #ff, DLookup("PW", "usysWEB") Print #ff, "cd " & 
> strFTPDir Print #ff, "lcd " & LocalDirectory Print #ff, "binary" Print 
> #ff, "get " & q & strFName & q Print #ff, "bye" Close #ff strExe =
> Environ$("COMSPEC") strExe = Left$(strExe, Len(strExe) -
> Len(Dir(strExe))) strExe = strExe & "ftp.exe -s:" & q & strList & q 
> ShellWait strExe, vbHide Kill strList End Function
> 
> Function InternetOK() As Boolean
> Dim strTemp As String
> Dim strExe As String
> Dim ff As Long
> strExe = Environ$("COMSPEC")
> strExe = Left$(strExe, Len(strExe) - Len(Dir(strExe)))
> 
> strExe = Environ("COMSPEC") & " /c "
> strExe = strExe & "ping " & DLookup("Site", "usysWEB") & " -n 1 > """
> & TempDir() & "pingtest.txt""" ShellWait strExe, vbHide 'Debug.Print 
> strExe ff = FreeFile Open TempDir() & "pingtest.txt" For Input As #ff 
> Line Input #ff, strTemp Close #ff If InStr(strTemp, "Ping request 
> could not find host") > 0 Then
>    InternetOK = False
> Else
>    InternetOK = True
> End If
> 
> End Function
> 
> Function FTPPutList(FileList() As String) As Boolean 'FileList Array 
> is 0 based Row(0) is blank. ' Subsequent rows formatted as:
> RemoteDir[Tab]LocalDir[Tab]Filename[Tab] Const q As String * 1 = """"
> Dim strExe As String Dim strLocalDir As String Dim strRemoteDir As 
> String Dim strLocalDirStore As String Dim strRemoteDirStore As String 
> Dim strFileName As String Dim strList As String Dim strCmds As String 
> Dim ff As Long Dim x As Long Dim strPut() As String strCmds =
> TempDir() & "FTPCmds.tmp" ff = FreeFile Open strCmds For Output As #ff 
> Print #ff, "open " & DLookup("Site", "usysWEB") Print #ff, 
> DLookup("Login", "usysWEB") Print #ff, DLookup("PW", "usysWEB") Print 
> #ff, "binary"
> 
> For x = 1 To UBound(FileList())
>     strPut() = Split(FileList(x), Chr$(9))
>     strRemoteDir = strPut(0)
>     strLocalDir = strPut(1)
>     strFileName = strPut(2)
> 
>     If strRemoteDir <> strRemoteDirStore Then
>        Print #ff, "cd " & strRemoteDir
>        strRemoteDirStore = strRemoteDir
>     End If
> 
>     If strLocalDir <> strLocalDirStore Then
>        Print #ff, "lcd " & strLocalDir
>        strLocalDirStore = strLocalDir
>     End If
> 
>     If Dir(strLocalDir & strFileName) = "" Then
>        MsgBox strLocalDir & strFileName & " not found!"
>        Exit Function
>     End If
> 
>     Print #ff, "put " & q & strFileName & q Next Print #ff, "bye"
> Close #ff strExe = Environ$("COMSPEC") strExe = Left$(strExe,
> Len(strExe) - Len(Dir(strExe))) strExe = strExe & "ftp.exe -s:" & q & 
> strList & q ShellWait strExe, vbHide 'vbNormalFocus End Function
> ---------------------- END OF modFTP
> 
> modFTP also uses this
> 
> Private Declare Function GetTempPath Lib "kernel32" Alias 
> "GetTempPathA" _ (ByVal nBufferLength As Long, ByVal lpBuffer As
> String) As Long
> 
> Public Function TempDir() As String
> Dim strPath As String
>  strPath = Space(MAX_PATH)
>  GetTempPath Len(strPath), strPath
>   TempDir = Left(strPath, InStr(1, strPath, vbNullChar) - 1) End
>   Function
> 
> 
> 
> On 6 May 2020 at 11:07, David Emerson wrote:
> 
> > Hi Listers,
> > 
> > 
> > 
> > I hope everyone is keeping safe.
> > 
> > 
> > 
> > Can anyone give me recommendations for code/software so that I can 
> > log into a secure FTP site using a username and password, and upload 
> > and download files via vba?
> > 
> > 
> > 
> > Regards
> > 
> > David Emerson
> > Dalyn Software Ltd
> > Wellington, New Zealand
> 
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
> 
> --
> AccessD mailing list
> AccessD at databaseadvisors.com
> http://databaseadvisors.com/mailman/listinfo/accessd
> Website: http://www.databaseadvisors.com
> 


-- 
AccessD mailing list
AccessD at databaseadvisors.com
http://databaseadvisors.com/mailman/listinfo/accessd
Website: http://www.databaseadvisors.com



More information about the AccessD mailing list