C# filestream未完成对文件的写入
该程序所做的是转到网页,逐行读取源代码,去掉html标记/代码,然后将实际文本/信息写入文本文件。因为我希望文本文件只包含我想要的数据/信息,而不包含其他内容,所以我让它查找一个特定的字符串,该字符串告诉它找到了正确的节,以便它可以开始写入文本文件,然后它查找另一个字符串,以知道何时找到该节的结尾。它正确地在文件中的正确行开始和停止(我放了一个计数器以确保,它正确地在正确的点停止/开始),但是,它没有完成将所有信息写入文本文件的操作。它甚至不停在特定的线的末端——它经常停止在一条直线的中间书写。例如,如果我想让它读4行,输出可能如下所示: 第1行的文本。。 第2行的文本。。 李文 然后停下来,即使它应该读/写4行 下面是我的代码:C# filestream未完成对文件的写入,c#,text-files,streamreader,streamwriter,C#,Text Files,Streamreader,Streamwriter,该程序所做的是转到网页,逐行读取源代码,去掉html标记/代码,然后将实际文本/信息写入文本文件。因为我希望文本文件只包含我想要的数据/信息,而不包含其他内容,所以我让它查找一个特定的字符串,该字符串告诉它找到了正确的节,以便它可以开始写入文本文件,然后它查找另一个字符串,以知道何时找到该节的结尾。它正确地在文件中的正确行开始和停止(我放了一个计数器以确保,它正确地在正确的点停止/开始),但是,它没有完成将所有信息写入文本文件的操作。它甚至不停在特定的线的末端——它经常停止在一条直线的中间书写。
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,我尝试了让它继续读/写过表示部分结束的字符串,但似乎没有任何效果。我知道我无论如何都不是最棒的程序员,但我真的被难倒了。有人能分享一些见解吗?非常感谢您的帮助 您必须刷新()您的文件。。。或使用
using( System.IO.StreamWriter file = new System.IO.StreamWriter(filename)){
....
}
Process.Start(filename);
调用文件名上的Start之前,
StreamWriter文件
未关闭或刷新
关闭或处置
文件
对象。或者更好地使用将其包装在中您忘记调用file.Close()
。您的几个对象实现了IDisposable,因此必须使用
块在中。这包括WebResponse
,Stream
,StreamWriter
,等等。。。就像医生吩咐的那样……:)非常感谢,约翰,工作得很出色!:)你能解释一下为什么他们需要使用积木吗?
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();
}