1

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

1 回答 1

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();
    }
}

using对于所有与 SQL 相关的资源,您应该有类似的语句。这解决了眼前的问题——但目前尚不清楚这与读取文件名的特定业务有什么关系。这将取决于文件名在文本中的格式。据我记得,当涉及到这类事情时,FTP 实际上是非常不明确的。

我建议进行两项重大更改:

  • 将您的代码拆分为逻辑方法:
    • 处理 FTP 请求本身
    • 将数据解析为合适的格式
    • 将数据插入数据库
  • 尝试找到一个更高级别的 FTP 库,它会知道如何为您进行解析
于 2012-08-30T06:00:33.903 回答