bigsplash
asked on
Why only getting partial StandardOutput of a "Process.Started" FTP called from VB.NET?
I have a VB.NET application that does an FTP and redirects the Standard Output to a file. I only get partial data from the StandardOutput. The missing contents are the actual FTP replies (like "150 Open...." and "226 Transfer.....").
I've scoured this site and the internet, and have seen several others ask this similar question but none have any answers.
All is well is most situations, except of course in the one environment where the code will run in Production! I perform this FTP Routine two times in my code, sending output files to two different mainframe IPs. In my Dev environment (which happens to be XP), all is hunky-dorey for both routines; I get my desired reply codes. In my Test environment (which happens to be 2003), all is hunkey-dorey for one routine - the other in-house mainframe box does not produce the reply codes in the piped output log. However, when I do an FTP from the command prompt (in both Dev and Test environs), the Reply Codes are indeed there.
What's the .NET mystery? I suspect it's .NET and not the mainframe since all other combos work just fine.
Here's a code snippet:
FTPLabel:
Dim FixedLiteral As String = FileParam4
Dim DOS As New Process
Dim pinfo As New ProcessStartInfo("ftp.exe")
pinfo.Arguments = "-n -d -s:"
pinfo.Arguments += FixedLiteral
pinfo.RedirectStandardOutp ut = True ' set to "true" to enable logging
pinfo.RedirectStandardErro r = False
pinfo.UseShellExecute = False ' set to true to make silent/background
' Execute the process
DOS = Process.Start(pinfo)
If DOS.Start() Then
' Create the file for storing the output of the process
Dim outfile As New System.IO.StreamWriter(Fil eParam5)
outfile.Write(DOS.Standard Output.Rea dToEnd)
' Make sure the process has completed
DOS.WaitForExit()
' Dump all the output from the process into the file
'outfile.Write(DOS.Standar dOutput.Re adToEnd) 'original line and location
'outfile.WriteLine(DOS.Sta ndardOutpu t.ReadToEn d)
outfile.Close()
End If
'After the FTP process is done, I must open up the log file and check for the string "226 File received ok". If I don't find it, then I will have to try the FTP again.
mySRftp = New StreamReader(FileParam5)
mySRText = mySRftp.ReadToEnd()
If InStr(mySRText, "226 Transfer completed") > 0 Then
'Remove the concatenated ftp'ed file.
File.Delete(Localtitle)
Else
BadAttemptCnt += 1
If BadAttemptCnt < 4 Then
SendFTPEmail(Localtitle, BadAttemptCnt)
mySRftp.Close()
GoTo FTpLabel
End If
End If
This is the Output that is produced in DEV, that I want to see on the TEST box:
ftp> Connected to 162.xxx.xxx.x.
open 162.xxx.xxx.x
220 Upstanding Systems FTP Server version 70.144.48 ready.
ftp> ---> user XXXXXX
USER XXXXXX
331 User name is okay; need password.
--->
PASS XXXXXXXX
230 User logged in, proceed.
ftp> ftp>
---> ascii
TYPE A
200 Representation Type is ASCII Non-print.
ftp> ---> quote SITE RECL 770
SITE RECL 770
200 recordLen is 770 Characters.
ftp> ---> put C:\inetpub\wwwroot\Joseph\ OutgoingFd leMerge770 \ConcatFil e.txt 00000552
PORT 162,xxx,xxx,xxx,13,155
200 PORT command successful.
---> STOR 00000552
150 Opening data connection for 00000552 (162.xxx.xxx.xxx,3483).
226 Transfer completed to 00000552 ON PROGRAMMING.
ftp: 4632 bytes sent in 0.00Seconds 4632000.00Kbytes/sec.
ftp> ---> quit
QUIT
221 Goodbye.
This is the problematic output that I see on the TEST box:
---> open 162.xxx.xxx.x
user XXXXXX
USER XXXXXX
--->
PASS XXXXXXX
--->
ascii
TYPE A
---> quote SITE RECL 770
SITE RECL 770
---> put D:\Inetpub\wwwroot\Joseph\ OutgoingFd leMerge770 \ConcatFil e.txt 00000554
PORT 162,xxx,xx,xx,5,29
---> STOR 00000554
---> quit
QUIT
I've scoured this site and the internet, and have seen several others ask this similar question but none have any answers.
All is well is most situations, except of course in the one environment where the code will run in Production! I perform this FTP Routine two times in my code, sending output files to two different mainframe IPs. In my Dev environment (which happens to be XP), all is hunky-dorey for both routines; I get my desired reply codes. In my Test environment (which happens to be 2003), all is hunkey-dorey for one routine - the other in-house mainframe box does not produce the reply codes in the piped output log. However, when I do an FTP from the command prompt (in both Dev and Test environs), the Reply Codes are indeed there.
What's the .NET mystery? I suspect it's .NET and not the mainframe since all other combos work just fine.
Here's a code snippet:
FTPLabel:
Dim FixedLiteral As String = FileParam4
Dim DOS As New Process
Dim pinfo As New ProcessStartInfo("ftp.exe")
pinfo.Arguments = "-n -d -s:"
pinfo.Arguments += FixedLiteral
pinfo.RedirectStandardOutp
pinfo.RedirectStandardErro
pinfo.UseShellExecute = False ' set to true to make silent/background
' Execute the process
DOS = Process.Start(pinfo)
If DOS.Start() Then
' Create the file for storing the output of the process
Dim outfile As New System.IO.StreamWriter(Fil
outfile.Write(DOS.Standard
' Make sure the process has completed
DOS.WaitForExit()
' Dump all the output from the process into the file
'outfile.Write(DOS.Standar
'outfile.WriteLine(DOS.Sta
outfile.Close()
End If
'After the FTP process is done, I must open up the log file and check for the string "226 File received ok". If I don't find it, then I will have to try the FTP again.
mySRftp = New StreamReader(FileParam5)
mySRText = mySRftp.ReadToEnd()
If InStr(mySRText, "226 Transfer completed") > 0 Then
'Remove the concatenated ftp'ed file.
File.Delete(Localtitle)
Else
BadAttemptCnt += 1
If BadAttemptCnt < 4 Then
SendFTPEmail(Localtitle, BadAttemptCnt)
mySRftp.Close()
GoTo FTpLabel
End If
End If
This is the Output that is produced in DEV, that I want to see on the TEST box:
ftp> Connected to 162.xxx.xxx.x.
open 162.xxx.xxx.x
220 Upstanding Systems FTP Server version 70.144.48 ready.
ftp> ---> user XXXXXX
USER XXXXXX
331 User name is okay; need password.
--->
PASS XXXXXXXX
230 User logged in, proceed.
ftp> ftp>
---> ascii
TYPE A
200 Representation Type is ASCII Non-print.
ftp> ---> quote SITE RECL 770
SITE RECL 770
200 recordLen is 770 Characters.
ftp> ---> put C:\inetpub\wwwroot\Joseph\
PORT 162,xxx,xxx,xxx,13,155
200 PORT command successful.
---> STOR 00000552
150 Opening data connection for 00000552 (162.xxx.xxx.xxx,3483).
226 Transfer completed to 00000552 ON PROGRAMMING.
ftp: 4632 bytes sent in 0.00Seconds 4632000.00Kbytes/sec.
ftp> ---> quit
QUIT
221 Goodbye.
This is the problematic output that I see on the TEST box:
---> open 162.xxx.xxx.x
user XXXXXX
USER XXXXXX
--->
PASS XXXXXXX
--->
ascii
TYPE A
---> quote SITE RECL 770
SITE RECL 770
---> put D:\Inetpub\wwwroot\Joseph\
PORT 162,xxx,xx,xx,5,29
---> STOR 00000554
---> quit
QUIT
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Yes, I thought so myself..... I just happened to see it written out that way on some site and tried it..... I've changed it back, yet no luck.
If DOS.Start() Then
' Create the file for storing the output of the process
Dim outfile As New System.IO.StreamWriter(Fil eParam5)
' Make sure the process has completed
DOS.WaitForExit()
' Dump all the output from the process into the file
outfile.Write(DOS.Standard Output.Rea dToEnd) 'original line and location
outfile.Close()
End If
If DOS.Start() Then
' Create the file for storing the output of the process
Dim outfile As New System.IO.StreamWriter(Fil
' Make sure the process has completed
DOS.WaitForExit()
' Dump all the output from the process into the file
outfile.Write(DOS.Standard
outfile.Close()
End If
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
No additional data is written when Unicode is specified. :-(
Interesting thought about the StandardError. I created and wrote to this file too, and nope - it's blank.
A friend just e-mailed this link to me http://www.dotnet247.com/247reference/a.aspx?u=http://support.microsoft.com/
default.aspx?scid=kb;EN-US ;832679. It's apparently a way to use ftp managed .NET code. Long article..... I may try this tomorrow.
Interesting thought about the StandardError. I created and wrote to this file too, and nope - it's blank.
A friend just e-mailed this link to me http://www.dotnet247.com/247reference/a.aspx?u=http://support.microsoft.com/
default.aspx?scid=kb;EN-US
SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Also, I failed to mention that the FTP "Put" command itself is performing sucessfully.