FtpWebRequest试图将文件夹中的所有文件名插入到sql表中?

时间:2012-08-30 05:41:49

标签: c# .net sql visual-studio-2010 ftpwebrequest

使用以下程序我试图将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();
        }
    }
}

1 个答案:

答案 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实际上是非常糟糕的。

我会建议两个重大变化:

  • 将代码拆分为逻辑方法:
    • 处理FTP请求本身
    • 将数据解析为合适的格式
    • 将数据插入数据库
  • 尝试找到一个更高级别的FTP库,它将知道如何为您解析