2013-05-22 16 views
0

Я создал это для формы. Если вы получаете всю информацию и, похоже, работаете, но когда я проверяю текстовый файл, там ничего не записывается, и это позволяет мне дважды запускать форму перед ошибкой. Кто-нибудь видит проблему?Не записывается в текстовый файл

const string FileName = "Friends.txt"; 
Friend friend = new Friend(); 
FileStream file = new FileStream(FileName, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite); 
FileStream file2 = new FileStream(FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); 

public Form1() 
{ 
    InitializeComponent(); 
} 

private void enter_Click(object sender, EventArgs e) 
{ 
    StreamWriter write = new StreamWriter(file2); 

    try 
    { 
     friend.FirstName = firstName.Text; 
     friend.LastName = lastName.Text; 
     friend.PhoneNumber = phoneNumber.Text; 
     friend.Month = Convert.ToInt32(birthMonth.Text); 
     friend.Day = Convert.ToInt32(birthday.Text); 
     write.WriteLine(friend.ToString()); 
     MessageBox.Show("Wrote " + friend.ToString() + " to file."); 
    } 
    catch(Exception error) 
    { 
     MessageBox.Show(error.Message + " Please reenter the information."); 
    } 
    firstName.Clear(); 
    lastName.Clear(); 
    phoneNumber.Clear(); 
    birthMonth.Clear(); 
    birthday.Clear(); 
    write.Close(); 
    file2.Close(); 
} 
+1

Я знаю, что люди уже ответили на это, но если вы собираетесь сказать «это ошибка», по крайней мере, скажите, что это за текст ошибки. – gunr2171

ответ

5

Вы не можете использовать файлы, как это. Они открываются один раз, только когда экземпляр класса создается. И затем в конце enter_Click() вы закрываете файл, поэтому при следующем вызове enter_Click() файл закрывается, и он терпит неудачу.

Создайте файлы внутриenter_Click(), чтобы они открывались и закрывались каждый раз, когда он вызывается.

Используйте ключевое слово using, чтобы убедиться, что они закрыты, даже если произошло исключение.

Ваш код должен выглядеть следующим образом:

private void enter_Click(object sender, EventArgs e) 
{ 
    using (FileStream file2 = new FileStream(FileName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite)) 
    { 
     using (StreamWriter write = new StreamWriter(file2)) 
     { 
      try 
      { 
       friend.FirstName = firstName.Text; 
       friend.LastName = lastName.Text; 
       friend.PhoneNumber = phoneNumber.Text; 
       friend.Month = Convert.ToInt32(birthMonth.Text); 
       friend.Day = Convert.ToInt32(birthday.Text); 
       write.WriteLine(friend.ToString()); 
       MessageBox.Show("Wrote " + friend.ToString() + " to file."); 
      } 
      catch (Exception error) 
      { 
       MessageBox.Show(error.Message + " Please reenter the information."); 
      } 
      firstName.Clear(); 
      lastName.Clear(); 
      phoneNumber.Clear(); 
      birthMonth.Clear(); 
      birthday.Clear(); 
     } 
    } 
} 

Существует альтернативный способ, которым Вы могли бы справиться с этим - вы можете открыть файл только один раз, и закрыть его только тогда, когда расположен класс. Затем вы можете просто добавлять к файлу, не открывая и закрывая его.

I не рекомендую делать это таким образом. Это было бы более эффективно, но оно намного более подвержено ошибкам, и если ваша программа выйдет из строя, существует опасность того, что файл не сможет записать на нее данные, что может привести к повреждению файла.

Лучше играть в нее безопасно и продолжать открывать и закрывать файл, если вы не пишете лот данных; только тогда вы захотите рассмотреть этот альтернативный путь.

+0

Да. См. Примеры здесь: http://msdn.microsoft.com/en-us/library/system.io.streamwriter.aspx – tnw

+0

Я положил его вне метода щелчка, потому что у меня больше кнопок, вызывающих один и тот же файл. Мне просто нужно создать новый FileStream в каждой кнопке? – Evan

+0

Вам следует рассмотреть возможность использования общего частного метода в вашей форме, который вызывает все нажатия кнопки мыши для записи в файл. –

0

Вам необходимо очистить и/или закрыть свой потоковик, и вы также должны его утилизировать. Лучший способ справиться с все это с using утверждением:

using(var write = new StreamWriter(file2) 
{ 
    //... your code 
} 

Как @Matthew Уотсон сказал, вы не должны создавать свои объекты FileStream, как глобалов в форме, либо. Создание их в случае щелчка, и положить в использовании потокового видео операторы, а также:

using(var file2 = new FileStream("Friends.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite) 
{ 
    using(var write = new StreamWriter(file2) 
    { 

    } 
} 
Смежные вопросы