patterncsharpMinor
Data to FTP upload by stream copy
Viewed 0 times
streamftpuploaddatacopy
Problem
I'd like to check the following process relating to the uploading of data by FTP, after the data is read from a database.
I have a stored procedure that returns data in the following pipe delimited format in a single column. It typically returns around 300 rows, each row has about 300 bytes.
The application then submits that data by FTP, typically <100k overall.
Here's the mechanism used, restricted to .NET 3.5.
I'd like to check whether the stream and ftp processing looks ok, or whether there are other stream types to consider (
I have a stored procedure that returns data in the following pipe delimited format in a single column. It typically returns around 300 rows, each row has about 300 bytes.
1234|||||PROPERTY|||MARKET INDEX|||||ADDRESS|||||1||||GBP|||||||20110930||||||||C|OFFICE|F||The application then submits that data by FTP, typically <100k overall.
Here's the mechanism used, restricted to .NET 3.5.
// database method returns dataset/datareader, converted and passed to method as
// IEnumerable data
string ftpServerIP = "5.4.3.2:21";
string targetFileName = "mann.txt";
string username = "manfred";
string password = "*******";
Uri uri = new Uri(String.Format("ftp://{0}/{1}", ftpServerIP, targetFileName));
FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(uri);
reqFTP.Credentials = new NetworkCredential(username, password);
reqFTP.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP.KeepAlive = false;
reqFTP.UsePassive = false;
MemoryStream stIn = new MemoryStream();
using (StreamWriter sw = new StreamWriter(stIn))
{
foreach (string item in data)
{
sw.WriteLine(item);
}
sw.Flush();
using (Stream stOut = reqFTP.GetRequestStream())
{
stOut.Write(stIn.GetBuffer(), 0, (int)stIn.Length);
}
}
FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
response.Close();I'd like to check whether the stream and ftp processing looks ok, or whether there are other stream types to consider (
BufferedStream?), or closure/disposal steps, etc...Solution
In general it looks fine to me.
I would prefer to see the
It may be a good idea to check the response and handle any error status. If you do ever add any code that uses the
Not really related to the code, but avoid using FTP if you can.
BufferedStream would not help anything here, your data is already in memory by the time any streams get created.I would prefer to see the
MemoryStream in a using block, although in this case it is being disposed when the StreamWriter is disposed.It may be a good idea to check the response and handle any error status. If you do ever add any code that uses the
FtpWebResponse, I would change to a using block, instead of the call to close. Not really related to the code, but avoid using FTP if you can.
Context
StackExchange Code Review Q#8450, answer score: 2
Revisions (0)
No revisions yet.