c#如何结束streamreader

c#如何结束streamreader,c#,streamreader,C#,Streamreader,我正在Uni中执行作业的项目Windows表单,我想搜索已创建的文本文件以匹配名字和姓氏,然后如果名称和姓氏存在,则写入一些附加信息。我构建了代码,没有显示任何错误,但是当我运行并尝试添加信息时,我收到了一个错误,该错误本质上是说下一个进程(Streamreader writer无法访问该文件,因为它已被另一个进程使用)我假设该进程是Streamreader,我试着对它进行编码以停止阅读,但没有用。我正在学习编码的前3个月,如果可能的话,我将非常感谢您的帮助,我在下面放了一段代码 //check

我正在Uni中执行作业的项目Windows表单,我想搜索已创建的文本文件以匹配名字和姓氏,然后如果名称和姓氏存在,则写入一些附加信息。我构建了代码,没有显示任何错误,但是当我运行并尝试添加信息时,我收到了一个错误,该错误本质上是说下一个进程(Streamreader writer无法访问该文件,因为它已被另一个进程使用)我假设该进程是Streamreader,我试着对它进行编码以停止阅读,但没有用。我正在学习编码的前3个月,如果可能的话,我将非常感谢您的帮助,我在下面放了一段代码

//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);
                        }

您正在读卡器中使用writer,使用相同的文件。 using在闭合的花括号后处理其中的对象

 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 (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);
    }
我用中断语句替换了sr.Close以退出。关闭读卡器会导致后续的peek在关闭时出错

还有,我注意到你没有设定性别?除非它是在别处设定的。
希望对你能使用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);

其中是StreamReader的结束括号。using指令将处理streamreader并释放其对文件的锁定,但在打开写入程序之前,您似乎不会关闭它?读取输入文件,写入临时文件,然后用临时文件压碎输入文件。您确定这部分代码已执行吗?因为你似乎在试图同时读写同一个文件。(似乎是个糟糕的主意)你是想把附加数据附加到同一个文件的末尾还是名字出现的行的末尾?嗨,伙计们,非常感谢你们的帮助,我已经删除了性别,因为不再需要它,如果我遇到与break相关的错误,我在使用此代码时仍然存在问题;“没有要中断或继续的封闭环”?奇数。。对我来说仍然有效。。你确定你没有得到休息;在while的括号{}之外的语句?我有一个windows窗体,它允许在写入文件的6行输入中输入客户机的详细信息。我有表格的另一部分,其中包含在不同机器上执行的练习分钟的复选框,我有一个搜索框和一个按钮,我试图在当前文件中搜索客户的名字和姓氏“在搜索框中输入的名称”,如果存在,则添加新的分钟信息。有一个单选按钮可选择活动开展的日期。因此,需要在不覆盖的情况下追加文件或添加新行。我需要什么样的更改?您需要完全重新考虑您的方法,并使用数据库,或者至少是XML文件。相比之下,像数据库一样读取和重写文本文件的性能会非常差。不过,要使我的代码在您的场景中工作,您只需修改if语句。但是你有3行要修改。。。要么运行3个单独元素的搜索,要么运行一次,并假设如果找到名字,接下来的两行必然是姓氏和性别。在这两种情况下,每次进行更新时都会重新编写数据库。