2017-02-16 45 views
1

我正在做一个项目Windows窗体的Uni分配,我想搜索一个已经创建的文本文件来匹配名字和姓氏,然后写入一些额外的信息,如果姓名和姓氏存在。我构建了代码并且没有显示任何错误,但是当我运行并尝试添加信息时,我被提供了一个基本上表示下一个进程的错误(Streamreader编写器无法访问该文件,因为它已被另一进程使用)我假设这个过程是streamreader,我试图编码它停止阅读无济于事。我在我的前3个月学习编码,如果可能的话,我会感谢一些帮助,我已经把我的代码片段放在下面。c#如何结束流读取器

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

StreamReader的右括号在哪里。 using指令将处理流读取器并释放它对文件的锁定,但是看起来好像在打开作者之后才会关闭它? – Wheels73

+0

读取输入文件,写入临时文件,然后用临时文件压碎输入文件。 –

+0

你确定你的代码的这部分被执行了吗?因为它似乎在尝试同时读取和写入同一个文件。 (看起来像一个可怕的想法) –

回答

1

您正在阅读器中使用您的作者,使用相同的文件。 一个使用配置其中的对象,关闭后括号。

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")){ 
} 
1

按照有关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退出。关闭阅读器会导致随后的查看错误,因为它已关闭。

此外,我注意到你没有设置性别?除非在其他地方设置。 希望可以帮到

+0

嗨,非常感谢您的帮助,我已经删除性别,因为它不再需要,我仍然有一个问题,当使用此代码提供我得到一个错误相关的休息; “没有封闭的循环可以打破或继续”? –

+0

奇怪..仍然适用于我..你确定你没有休息;在括号{}之外的语句? – Wheels73

0

你可以使用FileStream。它给你很多选项来处理文件:

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


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

我认为这是你想要/需要。你不能像试图那样追加到文件中。相反,您需要阅读输入文件,并在阅读时编写临时文件。而且,只要你的生产线符合你的要求,你就可以在你的修改中写下你的生产线。

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

我有一个windows窗体,它允许输入一个客户端的细节写入到一个文件的6行输入。我还有另一部分表格,其中包含用于在不同机器上执行练习分钟的复选框,我有一个搜索框和一个按钮,我试图搜索当前文件中的客户名和姓氏“输入的姓名搜索框“如果存在,则附加新的分钟信息。有一个单选按钮可以选择活动进行的那一天。所以需要将文件追加到或添加新行而不覆盖。我需要做什么改变? –

+0

您需要彻底重新考虑您的方法并至少使用数据库或XML文件。对文本文件进行读取和重写,就好像它是一个数据库一样,其性能相当差。尽管如此,为了让我的代码在你的场景中工作,你只需要摆弄if语句。但是你有3行修改...要么搜索3个单独的元素,要么运行一次,并假设如果你找到第一个名字,那么接下来的两行不可避免地会是姓氏和性别。无论哪种情况,每次更新时最终都会重新编写_database_。 –