簡體   English   中英

C#如何結束StreamReader

[英]c# how to end streamreader

我正在Uni中分配一個項目Windows窗體,我想搜索一個已經創建的文本文件以匹配名字和姓氏,然后在存在名字和姓氏的情況下寫一些附加信息。 我已經構建了代碼,並且沒有顯示任何錯誤,但是,當我運行並嘗試添加信息時,我看到的錯誤基本上是下一個進程(Streamreader writer無法訪問該文件,因為該文件已被另一個進程使用)。我假設此過程是streamreader,但我已嘗試對其進行編碼以停止讀取無濟於事。 我正在學習編碼的前三個月,如果可能的話,將不勝感激,我在下面提供了一段代碼。

//check if there is a file with that name
        if (File.Exists(sFile))
        {

            using (StreamReader sr = new StreamReader(sFile))
            {
                //while there is more data to read
                while (sr.Peek() != -1)
                {
                    //read first name and last name
                    sFirstName = sr.ReadLine();
                    sLastName = sr.ReadLine();
                }
                {
                    //does this name match?
                    if (sFirstName + sLastName == txtSearchName.Text)

                        sr.Close();
                }

                //Process write to file
                    using (StreamWriter sw = new StreamWriter(sFile, true))

                        {
                            sw.WriteLine("First Name:" + sFirstName);
                            sw.WriteLine("Last Name:" + sLastName);
                            sw.WriteLine("Gender:" + sGender);
                        }

您正在使用相同文件在閱讀器內部使用書寫器。 在閉合花括號后,“使用”將對象放置在其中。

 using(StreamReader reader = new StreamReader("foo")){
 //... some stuff
   using(Streamwriter writer = new StreamWriter("foo")){
   }
 }

這樣做:

 using(StreamReader reader = new StreamReader("foo")){
 //... some stuff 
 }

 using(Streamwriter writer = new StreamWriter("foo")){
 }

根據我對using語句的評論。 重新排列到下面。 我已經在本地測試過,它似乎可以正常工作。

   using (StreamReader sr = new StreamReader(sfile))
   {
        //while there is more data to read
        while (sr.Peek() != -1)
        {
            //read first name and last name
           sFirstName = sr.ReadLine();
           sLastName = sr.ReadLine();

             //does this name match?
            if (sFirstName + sLastName == txtSearchName.Text)
                break;
        }
     }

    using (StreamWriter sw = new StreamWriter(sfile, true))
    {
        sw.WriteLine("First Name:" + sFirstName);
        sw.WriteLine("Last Name:" + sLastName);
        sw.WriteLine("Gender:" + sGender);
    }

我已經用break語句替換了sr.Close退出了。 關閉閱讀器會導致隨后的窺視器關閉時出錯。

另外,我注意到您未設置性別? 除非它在其他地方設置。 希望能有所幫助

您可以使用FileStream。 它為您提供了許多處理文件的選項:

var fileStream = new FileStream("FileName", FileMode.Open,
 FileAccess.Write, FileShare.ReadWrite);


var fileStream = new FileStream("fileName", FileMode.Open, 
FileAccess.ReadWrite, FileShare.ReadWrite);

我認為這就是您想要/需要的。 您無法以嘗試的方式將其追加到文件中。 相反,您將要閱讀輸入文件,並在閱讀時編寫一個臨時文件。 而且,只要您的生產線符合您的要求,就可以編寫您的修改內容。

        string inputFile = "C:\\temp\\StreamWriterSample.txt";
        string tempFile = "C:\\temp\\StreamWriterSampleTemp.txt";

        using (StreamWriter sw = new StreamWriter(tempFile))//get a writer ready
        {
            using (StreamReader sr = new StreamReader(inputFile))//get a reader ready
            {
                string currentLine = string.Empty;
                while ((currentLine = sr.ReadLine()) != null)
                {
                    if (currentLine.Contains("Clients"))
                    {
                        sw.WriteLine(currentLine + " modified");
                    }
                    else
                    {
                        sw.WriteLine(currentLine);
                    }
                }
            }
        }

        //now lets crush the old file with the new file
        File.Copy(tempFile, inputFile, true);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM