2011-07-17 36 views
0

我按照流派的順序遍歷電影列表,並且我正在嘗試創建和寫入文件。我想創建一個文件,寫一個文件,然後在我移動到下一個流派時關閉它,然後創建一個新文件。如何最好地管理C中循環中的多個流#

當我嘗試關閉Stream時,現在我正在使用「未分配的本地變量GenStream」。但是,如果我將其註釋掉,並且不關閉流,則在ELSE語句中出現相同的錯誤。我不清楚爲什麼我會收到這些錯誤,並希望能幫助解決這些錯誤。我注意到我在下面的代碼中出現錯誤。

/// <summary> 
/// Creates a file for each Genre, and writes movie info to each for the cooresponding movies 
/// </summary> 
/// <param name="cPath">Path to create HTML files in</param> 
/// <param name="mList">List of Movies to generate Genre and Movie info from</param> 
public static void WriteGenreHTML(string cPath, List<Movie> mList) 
{ 
    int lineID = 0; 
    string tmpGen = null; 
    string strHeader, strMovie, strGenre, tmpGenre = null; 
    StreamWriter genStream; 

    // Gets a list of unique Genres from the MovieList 
    var distinctGenres = from m in mList 
         from genre in m.Genres 
         group genre by genre into genres 
         select genres.First(); 

    // Gets a list of Movies with the associated Genres 
    var moviesWithGenre = from g in distinctGenres 
          from m in mList 
          where m.Genres.Contains(g) 
          orderby g, m.Title 
          select new { Genre = g, Movie = m }; 

    // Traverses list of movies creating new HTML Genre files, and writing movie info to the HTML genre files 
    foreach (var m in moviesWithGenre) 
    { 
     // Creates new HTML file if new Genre is detected 
     if (m.Genre != tmpGen) 
     { 
      tmpGen = m.Genre; 

      // Closes previously open Stream 
      genStream.Close(); // ERROR: "Use of unassigned local variable 'genStream' 

      // initiates streamwriter for catalog output file 
      FileStream fs = new FileStream(cPath + Path.DirectorySeparatorChar + m.Genre, FileMode.Create); 

      genStream = new StreamWriter(fs); 

      // Generates header info for new file, and new Genre 
      strHeader = "<style type=\"text/css\">\r\n" + "<!--\r\n" + "tr#odd {\r\n" + " background-color:#e2e2e2;\r\n" + " vertical-align:top;\r\n" + "}\r\n" + "\r\n" + "tr#even {\r\n" + " vertical-align:top;\r\n" + "}\r\n" + "div#title {\r\n" + " font-size:16px;\r\n" + " font-weight:bold;\r\n" + "}\r\n" + "\r\n" + "div#mpaa {\r\n" + " font-size:10px;\r\n" + "}\r\n" + "\r\n" + "div#genre {\r\n" + " font-size:12px;\r\n" + " font-style:italic;\r\n" + "}\r\n" + "\r\n" + "div#plot {\r\n" + " height: 63px;\r\n" + " font-size:12px;\r\n" + " overflow:hidden;\r\n" + "}\r\n" + "\r\n" + "div#genre_heading {\r\n" + " height: 50px;\r\n" + " font-size: 24px;\r\n" + " font-weight: bold;\r\n" + " text-align: center;\r\n" + " text-decoration: underline;\r\n" + "}\r\n" + "-->\r\n" + "</style>\r\n" + "\r\n" + "<html>\r\n" + " <body>\r\n" + "  <table>\r\n"; 
      strHeader += "   <tr>\r\n" + "    <td colspan=2>\r\n" + "     <div id=\"genre_heading\">" + m.Genre + "</div>\r\n" + "    </td>\r\n" + "   </tr>\r\n" + "\r\n"; 

      // Writes header HTML to stream 
      genStream.WriteLine(strHeader); 

      Console.WriteLine(); 
      Console.WriteLine("Now Processing " + m.Genre); 
     } 
     // Otherwise creates and writes HTML code for the Movie 
     else 
     { 
      // Creates string of links to the Genre HTML pages 
      foreach (string genre in m.Movie.Genres) 
       tmpGenre += ", <a href=\"" + genre + ".html\" target=\"_blank\">" + genre + "</a>"; 
      strGenre = tmpGenre != null ? tmpGenre.Substring(2) : null; 

      // Generates the HTML for the Movie 
      strMovie = lineID == 0 ? "   <tr id=\"odd\" style=\"page-break-inside:avoid\">\r\n" : "   <tr id=\"even\" style=\"page-break-inside:avoid\">\r\n"; 
      strMovie += "    <td>\r\n" + "     <img src=\".\\images\\" + m.Movie.ImageFile + "\" width=\"75\" height=\"110\">\r\n" + "    </td>\r\n" + "    <td>\r\n" + "     <div id=\"title\">" + m.Movie.Title + "</div>\r\n" + "     <div id=\"mpaa\">" + m.Movie.Certification + " " + m.Movie.MPAA + "</div>\r\n" + "     <div id=\"genre\">" + strGenre + "</div>\r\n" + "     <div id=\"plot\">" + m.Movie.Plot + "</div>\r\n" + "    </td>\r\n" + "   </tr>\r\n"; 

      // Writes the HTML to the stream 
      genStream.WriteLine(strMovie); // ERROR: "Use of unassigned local variable 'genStream' 
      lineID = lineID == 0 ? 1 : 0; 
     } 
    } 

    string closingHTML = "  </table>\r\n" + " </body>\r\n" + "</html>"; 
    genStream.WriteLine(closingHTML); 
    genStream.Close(); 
} 

回答

2

您可以使用下面的代碼來驗證流已初始化或不

如果流那麼初始化可以將其關閉

if (genStream == null) 
{ 
genStream.Close() 
} 

希望這會爲你工作。 ..

+0

初始的StreamWriter設置爲null的伎倆。 – Dizzy49

1

可能你也可以添加,除了這裏的答案,是使用「使用」關鍵字,因爲它會注入到最後IL嘗試/最後表示法,這將確保您即使發生異常情況,ream也會關閉。總之僞代碼可以是這樣的:

使用(StreamWriter的genStream =新的StreamWriter(...)){

//use stream here 

    genStream.Close(); 

} // 處置genStream將被從出口自動調用「使用」。

希望這會有所幫助。

問候。

+0

謝謝,我想我會嘗試將其用於代碼中。 – Dizzy49

1

你得到「使用未分配的局部變量'GenStream'」錯誤的原因是因爲你聲明瞭它,當你在你的if塊中調用genStream.Close()時,它沒有被賦值 - 這只是一個聲明(將其視爲佔位符)。

當你註釋掉genStream.Close()時,你在else塊中再次出現錯誤,因爲(從else塊的作用域角度看)它再次沒有被分配任何東西。

這是我在我的最後一點建議您以前的帖子的例子:

foreach (var g in DistinctGenres) 
{ 
    FileStream fs = new FileStream(cPath + Path.DirectorySeparatorChar + g.Genre, FileMode.Create); 
    StreamWriter genStream = new StreamWriter(fs); 

    // Write your header here 

    foreach (var m in Genres) 
    { 
     // Generates the HTML for the Movie 

     // Writes the HTML to the stream 
     genStream.WriteLine(strMovie); 
     lineID = lineID == 0 ? 1 : 0; 

    } 

    string closingHTML = "  </table>\r\n" + " </body>\r\n" + "</html>"; 
    genStream.WriteLine(closingHTML); 
    genStream.Close(); 
} 

這elminates需要的,如果檢查,一般簡化你想要什麼來完成,IMO。

您可能需要調整兩個查詢,或者保留第一個查詢,並根據您正在構建網頁的當前流派進行第二個查詢。

另外一個想法 - 移動第二查詢到的第一個foreach循環中,當前類型分配給一個變量,並調整你的第二個這樣的查詢:

var moviesWithGenre = from g in distinctGenres 
         from m in mList 
         where m.Genres.Contains(currentGenre) // currentGenre is assigned a value in the first (outer) foreach loop 
         orderby g, m.Title 
         select new { Genre = g, Movie = m }; 
相關問題