文件流没有完成向文件写入

4
该程序的功能是访问网页,逐行读取源代码,剥离html标签/代码,然后将实际文本/信息写入文本文件。因为我希望文本文件只包含我想要的数据/信息,没有其他内容,所以它会查找特定的字符串来确定已经找到正确的部分,以便开始向文本文件写入,并查找另一个字符串以知道何时找到了部分的结尾。它在文件中正确地开始和停止(我放了一个计数器来确保,它在正确的位置停止/开始),但是它并没有完成将所有信息写入文本文件。它甚至不会在特定行的末尾停止——它经常在一行的中间停止写入。例如,如果我想让它读取4行,输出可能如下所示:
第1行文本... 第2行文本... 第3行文本...
就会停止,即使它应该读/写4行。
以下是我的代码:
private void button1_Click(object sender, EventArgs e)
{

    string tempString = "";
    string startString = "start string";
    string endString = "end string";
    bool startFlag = false;
    bool endFlag = true;
    string filename = @"C:\file.txt";

    System.IO.StreamWriter file = new System.IO.StreamWriter(filename);

    WebRequest request = WebRequest.Create("http://www.website.com/webpage.html");
    request.Credentials = CredentialCache.DefaultCredentials;
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Console.WriteLine(response.StatusDescription);
    Stream dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);

    while (endFlag)
    {
        tempString = reader.ReadLine();

        if (tempString.Contains(startString))
        {
            startFlag = true;
        }

        if (tempString.Contains("text"))
        {
            ...
        }

        if (tempString.Contains("other text"))
        {
            if (startFlag)
                file.WriteLine(tempString.Trim());
        }

        if (tempString.Contains("different text"))
        {
                if (startFlag && tempString.Length > 0)
                    file.WriteLine(tempString.Trim());
        }

        if (tempString.Contains(endString))
        {
            endFlag = false;
        }
    }

    MessageBox.Show("Done!", "Finished Writing", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

    reader.Close();
    dataStream.Close();
    response.Close();

    Process.Start(filename);

    this.Close();
}

我已经尝试了我能想到的所有方法,包括使用flush和继续读写超过标记该段落结束的字符串,但似乎都没有效果。虽然我知道自己编码技术并不是最好的,但这真的让我困惑了。是否有人可以提供一些见解?非常感谢您的任何帮助!

3
你忘记调用 file.Close() - Sani Huttunen
你的几个对象实现了IDisposable接口,因此必须放在using块中。这些对象包括WebResponseStreamStreamWriter等。 - John Saunders
3个回答

3
您需要使用Flush()函数将文件缓冲区中的数据写入磁盘,或者使用。
using( System.IO.StreamWriter file = new System.IO.StreamWriter(filename)){
   ....
}
Process.Start(filename);

2

在调用文件名的Start方法之前,您的StreamWriter file未关闭或刷新。

请关闭或处理file对象。或者更好的方法是将其包装在using中。


0
private void button1_Click(object sender, EventArgs e)
{

    string tempString = "";
    string startString = "start string";
    string endString = "end string";
    bool startFlag = false;
    bool endFlag = true;
    string filename = @"C:\file.txt";

    using (System.IO.StreamWriter file = new System.IO.StreamWriter(filename))
    {
        WebRequest request = WebRequest.Create("http://www.website.com/webpage.html");
        request.Credentials = CredentialCache.DefaultCredentials;
        using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
        {
            Console.WriteLine(response.StatusDescription);
            using (Stream dataStream = response.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(dataStream))
                {
                    while (endFlag)
                    {
                        tempString = reader.ReadLine();

                        if (tempString.Contains(startString))
                        {
                            startFlag = true;
                        }

                        if (tempString.Contains("text"))
                        {
                            // ...
                        }

                        if (tempString.Contains("other text"))
                        {
                            if (startFlag)
                                file.WriteLine(tempString.Trim());
                        }

                        if (tempString.Contains("different text"))
                        {
                            if (startFlag && tempString.Length > 0)
                                file.WriteLine(tempString.Trim());
                        }

                        if (tempString.Contains(endString))
                        {
                            endFlag = false;
                        }
                    }

                    MessageBox.Show("Done!", "Finished Writing", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);

                    reader.Close();
                }
                dataStream.Close();
            }
            response.Close();
        }
    }

    Process.Start(filename);

    this.Close();
}

很好...就像医生开的药方一样... :) - Darek
非常感谢John,工作得很好! :) 你能解释一下为什么它们需要在使用块中吗? - Will Carr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接