2017-02-16 25 views
1

Я делаю проект Форма Windows для назначения в Uni, я хочу искать уже созданный текстовый файл в соответствии с именем и фамилией, а затем писать дополнительную информацию, если имя и фамилия существуют. У меня есть код, созданный и не отображающий ошибок, однако, когда я запускаю и пытаюсь добавить информацию, мне предоставляется ошибка, которая по существу говорит о следующем процессе (писатель Streamreader не может получить доступ к файлу, поскольку он уже используется другим процессом) Я предполагаю, что этот процесс является streamreader, я пытался его кодировать, чтобы прекратить чтение безрезультатно. Я в течение первых трех месяцев изучаю кодирование и, по возможности, порекомендую некоторую помощь, я разместил фрагмент кода ниже.C# как прекратить 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); 
         } 
+0

Где находится закрывающая скоба для вашего StreamReader. Директива using будет утилизировать средство чтения потоков и освободить его блокировку в файле, но похоже, что вы не закрываете его, пока не откроете автора? – Wheels73

+0

Прочитайте свой входной файл, напишите во временный файл, затем раздавите свой входной файл с помощью файла temp. –

+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 (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 инструкцией о разрыве, чтобы выйти. Закрытие считывателя приводит к тому, что последующий заглядывает ошибка, поскольку она закрыта.

Кроме того, я заметил, что вы не устанавливаете пол? если оно не установлено в другом месте. Надеюсь, что это поможет

+0

Привет, ребята, спасибо за помощь, я удалил пол, поскольку он больше не нужен, у меня все еще проблема при использовании этого кода. Я получаю сообщение об ошибке, связанной с перерывом; «Нет замкнутого контура, из которого можно сломать или продолжить»? –

+0

Odd .. все еще работает для меня .. вы уверены, что у вас нет перерыва; за пределами скобок {}? – 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

У меня есть форма окна, которая позволяет вводить данные клиентов в 6 строк ввода, записанных в файл. У меня есть другая часть формы, содержащая флажки для упражнений, выполняемых на разных машинах, у меня есть окно поиска и кнопка, я пытаюсь выполнить поиск в текущем файле для имени и фамилии клиента «Имя, введенное в поле поиска ", если оно существует, добавьте новую информацию минут. Для выбора дня, когда была выполнена операция, есть переключатель. Поэтому файл необходимо добавить или добавить новые строки без перезаписи. Какие изменения мне нужны? –

+0

Вам нужно полностью переосмыслить свой подход и, по крайней мере, использовать базу данных или XML-файл. Чтение и переписывание текстового файла, как если бы это была база данных, будет очень плохо сравниваться. Хотя, чтобы заставить мой код работать в вашем сценарии, вам просто нужно возиться с оператором if. Но у вас есть 3 строки, которые нужно изменить ... Либо вы запустите поиск трех отдельных элементов, либо запустите его один раз и предположите, что если вы найдете имя, то следующие две строки неизбежно будут иметь фамилию и пол. В любом случае вы будете переписывать свою _database_ при каждом обновлении. –