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.
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<string> 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...
1 Answer 1
In general it looks fine to me. 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.
-
\$\begingroup\$ Can you elaborate on why to avoid FTP, and what alternatives you'd suggest? \$\endgroup\$WhiteHotLoveTiger– WhiteHotLoveTiger2016年06月09日 14:21:09 +00:00Commented Jun 9, 2016 at 14:21
}
(as StyleCop would suggest). I would also build out a URI withString.Format
. \$\endgroup\$