使用以下程序我试图将ftp服务器上的文件夹中列出的所有文件名插入到SQL表中。
写入表格时我收到错误
c#无法访问已处置的对象。对象名称 'system.net.sockets.networkstream'
reader.ReadToEnd()将整个流写入我想要的逐个文件名。
namespace Examples.System.Net
{
public class WebRequestGetExample
{
public static void Main()
{
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://myftpaddress.com/0708/");
request.Method = WebRequestMethods.Ftp.ListDirectory;
request.Credentials = new NetworkCredential("vish10", "MyPasswd");
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Console.WriteLine(reader.ReadToEnd());
SqlConnection sqlConnection1 = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DMSTG;Data Source=.");
SqlCommand cmd = new SqlCommand();
cmd.CommandText = @"Insert into FTPfileList0708Folder
values('" + reader.ReadToEnd().ToString() + "')";
cmd.Connection = sqlConnection1;
sqlConnection1.Open();
cmd.ExecuteNonQuery();
sqlConnection1.Close();
Console.WriteLine("Directory List Complete, status {0}", response.StatusDescription);
reader.Close();
response.Close();
}
}
}
答案 0 :(得分:1)
您已在此处阅读完整的回复:
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Console.WriteLine(reader.ReadToEnd());
一旦你读完它,就不能再读它了。
只需更改为
string text = reader.ReadToEnd();
...然后添加适当的using
语句来正确处理资源:
string text;
using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
{
using (Stream responseStream = response.GetResponseStream())
{
// No need to dispose of the StreamReader as we're already
// disposing of the stream. It wouldn't do any harm though.
// Is the text definitely encoded in UTF-8 though?
text = new StreamReader(responseStream).ReadToEnd();
}
}
对于所有与SQL相关的资源,您应该有类似的using
语句。
这解决了眼前的问题 - 但目前尚不清楚这与读取文件名的具体业务有什么关系。这取决于文本中文件名的格式。根据我的记忆,当涉及到这种事情时,FTP实际上是非常糟糕的。
我会建议两个重大变化: