2012-07-30 47 views
3

程序做的是出去一個網頁,逐行讀取源代碼,去掉html標籤/代碼,然後將實際的文本/信息寫入文本文件。因爲我希望文本文件只包含我想要的數據/信息,而不是其他任何東西,所以我找它尋找一個特定的字符串,告訴它找到了正確的部分,以便它可以開始寫入文本文件,然後尋找另一個字符串知道何時發現該部分的結尾。它正確地啓動和停止在文件中的正確的行(我把一個計數器確保,並且它正確停止/在正確的位置開始),但是,它沒有完成將所有信息寫入文本文件。它甚至不會停在特定行的末尾 - 它通常會停止在行的中間寫入。舉個例子,如果我想它來閱讀4線,輸出可能類似於:文件流沒有完成寫入文件

文本線路1 .. 文本線路2 .. 文本鋰

,只是停止,即使它應該讀/寫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(); 
} 

我已經試過幾乎所有我能想到的,我一直在使用沖洗試過,我試着讓它繼續讀/寫過去的字符串信號該部分的結尾,但似乎沒有任何工作。我知道我不是最好的編碼者,但我真的很難過。誰能分享一些見解?任何幫助非常感謝!

+3

你忘了調用'file.Close()'。 – 2012-07-30 23:34:00

+0

您的一些對象實現了IDisposable,因此必須在'使用'塊中。這包括'WebResponse','Stream','StreamWriter'等。 – 2012-07-31 00:25:15

回答

3

你必須沖洗()的文件,或者......使用

using(System.IO.StreamWriter file = new System.IO.StreamWriter(filename)){ 
    .... 
} 
Process.Start(filename); 
+0

美麗,像魅力一樣工作!非常感謝! – 2012-07-31 15:30:33

2

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

不錯...只是醫生下令... :) – Darek 2012-07-31 11:43:31

+0

非常感謝約翰,工作太棒了! :)你能解釋他們爲什麼需要使用塊嗎? – 2012-07-31 15:36:48

+0

請參閱http://stackoverflow.com/tags/idisposable/info – 2012-07-31 16:02:06