2014-12-07 2 views
1

Streamwriter를 사용하여 목록 데이터를 텍스트 파일에 저장하지만 파일을 열면 파일이 항상 비어 있습니다. 목록을 가져와 모든 입력을 표시 할 수 있으므로 목록이 작동합니다. 파일 작성자를위한 코드를 작성합니다.streamwriter를 사용하지만 파일은 항상 비어 있습니다.

private void SaveToFile() 
    { 
     string taxpayerLine; 
     string taxpayerFile; 
     string myFileName; 
     FileInfo myFile; 
     SaveFileDialog taxpayerFileChooser; 

     StreamWriter fileWriter; 


     taxpayerFileChooser = new SaveFileDialog(); 
     taxpayerFileChooser.Filter = "All text files|*.txt"; 
     taxpayerFileChooser.ShowDialog(); 
     taxpayerFile = taxpayerFileChooser.FileName; 
     taxpayerFileChooser.Dispose(); 

     fileWriter = new StreamWriter(taxpayerFile, true); 

     foreach (Taxpayer tp in Taxpayers) 
     { 
      taxpayerLine = tp.Name + "," + 
       tp.Salary.ToString() + "," + 
       tp.InvestmentIncome.ToString() + "," + 
       (tp.InvestmentIncome + tp.Salary).ToString() + "," + 
       tp.GetRate().ToString() + "," + 
       tp.GetTax().ToString(); 

      fileWriter.WriteLine(taxpayerLine); 
     } 

     fileWriter.Close(); 
     fileWriter.Dispose(); 

     myFile = new FileInfo(taxpayerFile); 
     myFileName = myFile.Name; 

     MessageBox.Show("Data Saved to " + myFileName); 
    } 
+1

foreach가 중단되면 납세자에게 어떤 것이 있습니까? –

+2

당신은 일회용 물건에'using' 문을 사용해야합니다. 그러나 예외가 발생하지 않고 코드가 실행된다고 가정하면 파일이 비어있을 수있는 유일한 방법은 잘못된 파일을 보거나 "Taxpayers"컬렉션이 비어있는 경우입니다. –

답변

1

당신은 다음과 같이 코드를 변경 시도 할 수 있습니다 :

private void SaveToFile() 
{ 
    string taxpayerLine; 
    string taxpayerFile = string.Empty; 
    string myFileName; 
    FileInfo myFile; 

    using (SaveFileDialog taxpayerFileChooser = new SaveFileDialog()) 
    { 
     taxpayerFileChooser.Filter = "All text files|*.txt"; 
     if (DialogResult.OK == taxpayerFileChooser.ShowDialog()) 
     { 
      taxpayerFile = taxpayerFileChooser.FileName; 
     } 
    } 

    if (!string.IsNullOrEmpty(taxpayerFile)) 
    { 
     using (StreamWriter fileWriter = new StreamWriter(taxpayerFile, true)) 
     { 
      foreach (Taxpayer tp in Taxpayers) 
      { 
       taxpayerLine = tp.Name + "," + 
       tp.Salary.ToString() + "," + 
       tp.InvestmentIncome.ToString() + "," + 
       (tp.InvestmentIncome + tp.Salary).ToString() + "," + 
       tp.GetRate().ToString() + "," + 
       tp.GetTax().ToString(); 

       fileWriter.WriteLine(taxpayerLine); 
      } 
     } 

     myFile = new FileInfo(taxpayerFile); 
     myFileName = myFile.Name; 

     MessageBox.Show("Data Saved to " + myFileName); 
    } 
    else 
    { 
     MessageBox.Show("Data not saved"); 
    } 
} 

using 문을 명시 적으로 호출 블록 실행 후 일회용 객체의 폐기() 메소드. http://msdn.microsoft.com/en-us/library/yh598w02.aspx

+0

코드는 사용자가 "취소"를 누르거나 파일을 선택하지 않고 대화 상자를 닫을 수 있도록 처리해야합니다. –

+0

추가 답변을 위해 제 대답을 수정했습니다. 희망이 도움이됩니다. – mgigirey

+0

예, 이제 좋습니다. –

관련 문제