Rick, I created a simple program to find out why I am getting an error when using wwsftp to pull a list of the files in a directory.
SET PROCEDURE TO "c:\vfe2005\dev\itf\wwsftp.prg"
SET STEP on
DO wwsftp
loFtp = CREATEOBJECT("wwSFTP")
loFtp.nFtpPort = 22
lcHost = "xxx.xxx.xxx.xxx" && Not sending the real ip address for security reasons
lcuserid= "apsoarmms"
lcpassword = "APSOTru$tFu5d!@cfs.com"
IF NOT VARTYPE(loFtp)=="O"
RETURN .f.
ENDIF
lnhndlLogDebugFTPStuff=FCREATE(".\TEMP\ITFCOM001_Log_DebugFTPStuff.txt")
FPUTS(lnhndlLogDebugFTPStuff,"loFTP is an object.")
lnResult = loFtp.FtpGetFile(lcHost,"resync-12092020071546.arm","c:\apso\fromjms\itf-apso\resync-12092020071546.arm",1,lcuserid,lcpassword)
IF (lnResult != 0)
? loFtp.cErrorMsg
ENDIF
loFiles = loFtp.FtpListFiles("") && or: "/subfolder" or "subfolder2" (relative)
IF NOT VARTYPE(lofiles)="O"
&& dont proceed because there are no files
&&loFTP.release()
&& why did i not use ftpclose?
&&loFtp.FtpClose()
loFTP.destroy()
loFtp= .null.
RELEASE loFTP
FPUTS(lnhndlLogDebugFTPStuff,"loFiles is NOT an object")
FCLOSE(lnhndlLogDebugFTPStuff)
RETURN .f.
ENDIF
Everything works perfect until the call to FtpListFiles. I get:
Where do I start to look for the reason for this error? Thanks, John
You need to open the connection when using FtpListFiles()
.
It might be confusing because FtpGetFile()
and FtpSendFile()
work without a call to FtpConnect()
as they are self-contained routines that open a connection receive or send the file and then close the connection.
All other commmands work with an open connection using FtpConnect()
as you can run multiple commands on a single connection.
Look at the example here:
+++ Rick ---
When I saw your response I thought "that's easy and sounds logical". Well, nothing is ever easy.
I did as you asked. Now I get an error on the call to loFtp.FtpConnect. File 'isnullorempty.prg' does not exist.
I dug around and found that function is in wwutils.prg so I modified my set procedure command to also include wwutils.prg
It still can not find the isnullorempty.prg so I am lost.
Also, the example you sent wwSFTP::FtpListFiles() is creating an object wwFTP rather than wwSFTP which is what I am creating. Perhaps it is going over my head but that could have something to do with my issue?
Thanks, John
ISNULLOREMPTY()
is a function in wwUtils.prg
. It's somewhat recent so maybe you're not using the latest version of that file...
+++ Rick ---
The function isnullorempty is in my wwutils.prg
Here is modified test program:
SET PROCEDURE TO "c:\vfe2005\dev\itf\wwsftp.prg", "c:\vfe2005\dev\itf\wwutils.prg"
SET STEP on
DO wwsftp
loFtp = CREATEOBJECT("wwSFTP")
loFtp.nFtpPort = 22
lcHost = "xxx.xxx.xxx.xxx" && not sending ip for security reasons
lcuserid= "apsoarmms"
lcpassword = "APSOTru$tFu5d!@cfs.com"
IF NOT VARTYPE(loFtp)=="O"
RETURN .f.
ENDIF
lnhndlLogDebugFTPStuff=FCREATE(".\TEMP\ITFCOM001_Log_DebugFTPStuff.txt")
FPUTS(lnhndlLogDebugFTPStuff,"loFTP is an object.")
lnResult = loFtp.FtpGetFile(lcHost,"resync-12092020071546.arm","c:\apso\fromjms\itf-apso\resync-12092020071546.arm",1,lcuserid,lcpassword)
IF (lnResult != 0)
? loFtp.cErrorMsg
ENDIF
loFtp.FtpConnect(lchost,lcuserid,lcpassword)
loFiles = loFtp.FtpListFiles("") && or: "/subfolder" or "subfolder2" (relative)
loFtp.FtpClose()
IF NOT VARTYPE(lofiles)="O"
&& dont proceed because there are no files
&&loFTP.release()
&& why did i not use ftpclose?
&&loFtp.FtpClose()
loFTP.destroy()
loFtp= .null.
RELEASE loFTP
FPUTS(lnhndlLogDebugFTPStuff,"loFiles is NOT an object")
FCLOSE(lnhndlLogDebugFTPStuff)
RETURN .f.
ENDIF
llvaluetoreturn=.f.
FOR EACH loFile IN loFiles FOXOBJECT
FPUTS(lnhndlLogDebugFTPStuff,ALLTRIM(lofile.name))
lnResult = loFtp.FtpGetFile(lchost,ALLTRIM(loFile.Name),"c:\apso\fromjms\itf-apso\tmpprocessing\"+ALLTRIM(lofile.name),1,lcuserid,lcpassword)
IF lnResult=0
FPUTS(lnhndlLogDebugFTPStuff,ALLTRIM(lofile.name)+"did the ftpget")
loFtp.FtpDeleteFile(".\"+ALLTRIM(lofile.name))
llvaluetoreturn=.t.
ELSE
FPUTS(lnhndlLogDebugFTPStuff,ALLTRIM(lofile.name)+"ftpget was not sucessful")
ENDIF
ENDFOR
&& you got everything from the ftp server and copied it to the subfolder for processing and you deleted them from the ftp server.
&& now i need to move them to the normal folder but doing so oldest first copying the data file and then the associated ready file.
&& Then after all that delete everything in the processing folder.
&& One more safety - may not want to copy any file from the processing folder into the normal folder if it is older than the last file we copied to the normal folder.
&& probably have to put the datetime of the files in a text file and as I copy them check against that file to see if it is newer or something.......
FCLOSE(lnhndlLogDebugFTPStuff)
RETURN llvaluetoreturn
I get the following error when stepping thru the code at loFtp.FtpConnect(lchost,lcuserid,lcpassword):
Keep in mind that when I am writing programs like this test program, I am working outside my "normal" environment of Visual FoxExpress so things like SET PROCEDURE TO are not something that comes natural to me. I am using the copy of wwutils.prg that shipped with my copy of webconnection. It is dated 1/6/20 and again, it DOES contain the function isnullorempty. I used GoFish and searched for all instances of isnullorempty thinking maybe there is another something that is messing me up. The one in wwutils.prg is the ONLY one located.
Thanks, John
Make sure the right version of wwUtils.prg
is in your path. If it's loaded and ISNULLOREMPTY()
can't be found, then some other version is getting loaded.
DO wwSFTP
should load all dependencies including wwUtils
(which is loaded as part of wwFtp.prg
).
When in doubt check:
SET("PROCEDURE")
and look for the wwUtils
entry.
And recompile your code just in case you had an old version.
+++ Rick ---
Rick, I feel really stupid. I have spent several hours looking for old versions of wwutils and trying many things. I have come across something that I believe I must figure out before I will ever find the issue.
I am in the VFP command window. I issue set default to c:\vfe2005\dev\itf (which is a valid directory). Then I issue ?set("default"). Foxpro tells me the value is C: so of course that is telling me that my set default command is not doing anything.
I have tried set default to "c:\vfe2005\dev\itf". I tried cd to c:\vfe2005\dev\itf which works and then using SYS(5)+SYS(2003) which pulls the current directory correctly. I tried putting the path in a variable and with and without the &.
Obviously I do not understand how SET DEFAULT works. I feel like I just set myself back 30 years. Any insight appreciated.
Thanks, John
?Set("Default")
will only show the drive. Try ?FullPath(Set("Default"))
.
SET DEFAULT()
doesn't tell you anything useful. You need to use SET("PROCEDURE")
and look where things are loading from. That command will tell you:
- Whether wwUtils is loaded at all
- Where it was loaded from
Make sure you don't have something in your code that does SET PROCEDURE TO
without an ADDITIVE
clause which will wipe out all loaded libraries.
What matters is not the DEFAULT
but the PATH
.
Make sure that wwUtils.prg
exists and that it has a ISNULLOREMPTY()
function.
+++ Rick ---
Still, no luck.
I need to make this as simple as possible. New test program:
set step on
SET PROCEDURE TO "c:\vfe2005\dev\itf\wwutils.prg", "c:\vfe2005\dev\itf\wwsftp.prg"
?set("PROCEDURE")
lctestvar="johncook"
llretval=isnullorempty(lctestvar)
The ?set("PROCEDURE") command sends the following to my main visual foxpro window:
I get the foxpro error, file 'isnullorempty.prg' does not exist.
About the only thing that I see that may not look right is the value returned by set("PROCEDURE"). Notice the wwutils.fxp does not have any path yet the wwsftp.fxp does. That may be a clue. I am working out of the c:\vfe2005\dev\itf folder. As best I can tell there is no way that I could be using anything except what is in that folder. That folder contains both wwutils and wwsftp both of which I recompiled in the last few minutes.
I tried to add a code snippet containing my whole wwutils.prg but it is obviously to large. Instead, just to prove that my wwutils.prg DOES contain the isnullorempty function, I cut and pasted that function from my wwutils.prg:
************************************************************************
* IsNullOrEmpty
****************************************
*** Function: Returns whether a value is null or Empty
*** Assume:
*** Pass: lvValue - value
*** Return: .T. or .F.
************************************************************************
FUNCTION IsNullOrEmpty(lvValue,llCheckArray)
IF llCheckArray
lcType = TYPE("lvValue")
IF lcType = "A"
RETURN .T.
ENDIF
ENDIF
lcType = VARTYPE(lvValue)
IF lcType = "X" OR lcType = "U"
RETURN .T.
ENDIF
IF INLIST(lcType,"C","M","N","Y","D","T","L") AND EMPTY(lvValue)
RETURN .T.
ENDIF
RETURN .F.
ENDFUNC
* IsNullOrEmpty
Totally bluffed, John
Look in the file and make sure the function is actually in there... and recompile your PRG files.
+++ Rick ---
OK, I have looked at that 300 times and Yes, the function isnullorempty is in my wwutils.prg and I have recompiled it many times but still when I run my test program I get the error isnullorempty.prg does not exist.
I can only conclude that even though I have set procedure to my wwutils.prg and everything is in the directory from which I am working, that does not mean VFP can locate the function. I tried making a call to a different wwutils function File2Var. I get the same error.
I need to get this finished. Can I hire you to connect to my computer and take a look please?
Thanks, John
Remember that if you have a Set Procedure
somewhere in your code, and this line does not include the Additive
keyword, all previously 'values' will be removed from the list.
The same goes for Set Path
, Set Library
and Set Classlib
.
In the debugger, add Set('Procedure')
and Set('path')
to the Watch window
Hi Tore,
The whole program is only 5 lines. I am in the VFP command window. I do a cd to c:\vfe2005\dev\itf. The following program and wwutils.prg are all in the current directory.
set step on
SET PROCEDURE TO "c:\vfe2005\dev\itf\wwutils.prg", "c:\vfe2005\dev\itf\wwsftp.prg"
?set("PROCEDURE")
lctestvar="johncook"
llretval=isnullorempty(lctestvar)
return
OK, I have more information.
start VFP from the command window: cd c:\vfe2005\dev\itf set procedure to "c:\vfe2005\dev\itf\wwutils.prg" ?set("procedure") The above displays this in the main screen: C:\VFE\DEV\ITF\WWUTILS.FXP lctestvar="jc" ?isnullorempty(lctestvar) The above displays .F. in the main screen. YEA! That works perfectly.
Now put the same exact commands in a test.prg. Compile the prg and do the prg. I get an error, 'isnullorempty.prg' is not found. Besides getting the error, the only other thing that is different is when the ?set("procedure") is issued from test.prg it displays simply WWUTILS.FXP without the path. That has to be a clue.
Thanks, John
You delete all your FXP files. And if you're running a project, recompile the project.
That just looks like you likely have an old file.
Either way this is an environment problem on your end - it sounds like you have paths that point to multiple potentially different copies of the West Wind libraries. Make sure you don't have more than one version along your FoxPro path. When in doubt always delete all FXP files and try again (or recompile a project file if that's what you're running).
+++ Rick ---
You are correct in saying that I have an environment issue on my end. You are also correct in saying it acts like I am looking at an old fxp file. I came to those same conclusions.
I copied wwutils.prg to wwutils-copy.prg, changed my set procedure to use it instead and it works perfectly. That also would indicate I am accessing some old copy of wwutils.
I have removed all old fxp's. I even looked in windows registry thinking somehow windows was using that to know what copy of wwutils to use. I am not going to figure this out. The one clue that is persistent across all attempts is ?set("procedure") returns wwutils.fxp when it does NOT work and it returns c:\vfe2005\dev\itf\wwutils.fxp when it DOES work.
I have given up on figuring this out. I am confident it will work when I include the wwutils and wwsftp in my project, build an executable and run the exe which is all I need to do. The only time it does not work is when doing this from a simple compiled prg.
Thanks, John
I have made it a habit to regularly delete all .fxp files from all my folders.
wwUtils.fxp
means it's being loaded out of an .app
or .exe
file most likely. Full path means it's loading from disk.
If it's in your project (which it seems to be) double check and make sure the PRG file in the project points at the right file!
+++ Rick ---