문과 코린이의, [C#] 기록/C# 활용

[문과 코린이의 IT 기록장] C# 기초 예시 - StreamReader, StreamWrite

벼리네 2021. 6. 26. 22:15
반응형

[문과 코린이의 IT 기록장] C# 기초 예시 - StreamReader, StreamWrite

[문과 코린이의 IT 기록장] C# 기초 예시 - StreamReader, StreamWrite


0. C# _ StreamReader, StreamWrite에 대해서

1) 목적

- 텍스트 파일을 읽거나 쓰기 위해서 사용함. (즉, 텍스트 파일을 불러오거나, 텍스트 파일로 저장할 때 사용하는 것)

- 불러올 때 : StreamReader / 저장할 때 : StreamWrite -> 클래스 사용

- System.IO.File 클래스에서 비슷한 기능의 함수를 제공함.

 

[ System.IO.File Class ]

목적 사용 반환
불러올 때 File.ReadAllText("경로") String 형태
File.ReadAllLines("경로") String [ ] (배열) 형태
저장할 때 File.WriteAllText("경로", "읽어 올 Text File") Text File로 저장
File.WriteAllLines("경로", "배열형태의 String Data") Text File로 저장

 

2) 사용

- 프로그램 파일(Program File)의 로그(Log)를 기록하거나, 기록 된 로그(Log)를 읽어올 때 사용

 * 로그를 잘 만들어 놓을수록, 프로그램에 문제가 생겼을 때 원인을 찾기가 쉬워짐. 따라서 큰 프로그램일수록, 대기업일수록 로그를 잘 만들어 놓는 것이 매우 중요함.

- 프로그램 동작에 필요한 자료(Set Up File)를 저장 해두거나, 불러와서 사용 

 * Save Data : DB형태, XML 형태, Text File(String-문자) 형태


1. UI 부분

* TextBox - Enabled (False)

* SFDialog : saveFileDialog - 파일을 저장할 때 뜨는 창을 띄우는 컨트롤 ex) 다른 이름으로 저장

* OFDialog : openFileDialog - 파일을 열 때 뜨는 창을 띄우는 컨트롤


2. 코드 부분

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.IO; 

[ using System.IO ]
: 파일과 데이터 스트림에 대한 읽기 및 쓰기를 허용하는 형식과, 기본 파일 및 디렉터리 지원을 제공하는 형식이 포함되어 있다.
 * 스트림 : 데이터가 끊기지 않고 연속적으로 전송되는 것

- 닷넷(.NET)의 스트림중에 많이 사용되는 것이 먼저 FileStream임. 
 * FileStream : 파일의 입출력을 관리하고, 그것을 StreamWriter/StreamReader를 통해 파일에 데이터를 넣고 읽는 클래스를 사용하여 컨트롤을 하는 것

# StreamWriter 클래스 : TextWriter를 구현하여 특정 인코딩의 스트림에 문자를 쓴다.
# StreamReader 클래스 : 특정 인코딩의 바이트 스트림에서 문자를 읽는 TextReader를 구현한다.

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

 

namespace _20210626___StreamReader__StreamWrite

{

public partial class Form1 : Form

{

 public Form1()

 {

   InitializeComponent();

 }

 

private void btnConfigSet_Click(object sender, EventArgs e) // Config 설정하기 버튼을 클릭했을 때

{

 string strText = tboxData.Text;

// tboxData 텍스트 박스의 Text부분을, strText 변수에 넣는다.

 bool bChecked = cboxData.Checked;

// cboxData 체크 박스의 Checked 여부에 대해, bChecked 변수에 넣는다. (bool 타입)

 int iNumber = (int)numData.Value;

// numData NumbericUpDown의 값을 (int)형으로 변환시켜, iNumber 변수에 넣는다.

 

/* 위의 것들을 하나로 묶어줌 */

 StringBuilder sb = new StringBuilder(); 

[ StringBuilder ]
StringBuilder 객체는 string과 마찬가지로 문자열을 담는 역할을 한다.
- 그러나, string과 달리 문자열을 수정할 수 있다. (가변적이다)
cf ) 형식 : StringBuilder 변수이름 = new StringBuilder(문자열 내용)
 * 변수보다는 메서드를 사용하는 방식에 가까움
 * StringBuilder는 ToString()으로 string 타입으로 변환할 수 있음

ex ) 
StringBuilder sb= new StringBuilder();
sb.Append("A"); // 문자열 추가
sb.Insert(3,"test"); // 문자열 3번째 위치에 text라는 문자 삽입
sb.Remove(3,5); // 문자열 3번째 위치에서 5개의 문자들 제거
sb.Replace("test","test1"); // 문자열 중 test라는 문자 모두 test1로 변경
sb.Replace("test","test1", 1, 5); // 문자열 1~5 사이 중, test라는 문자 모두 test1으로 변경
sb.ToString(); // StringBuilder객체를 String형으로 변경한다.

 string strEnter = "\r\n" // 줄바꿈을 시켜주기 위해

 

 sb.Append(strText + "\r\n");

 sb.Append(bChecked.ToString() + strEnter);

 sb.Append(iNumber.ToString() + strEnter);

 

 tboxConfigData.Text = sb.ToString();

// 객체 sb를 string형태로 변환하여, tboxConfigData 텍스트 박스의 Text부분에 표시한다.

}

 

 

private void btnSave_Click(object sender, EventArgs e) // Text 저장하기 버튼을 클릭했을 때

{

 string strFilePath = string.Empty; // 저장할때 파일 경로 변수

 

 SFDialog.InitialDirectory = Application.StartupPath;

// SFDialog.InitialDirectory : 다이얼 로그가 Open 되었을 때, 최초의 경로 설정

[ Application.StartupPath ]
- 현재 Application이 존재하는 경로 (프로그램 실행 파일 위치)
- Winform인 경우에만 사용 가능
[ SaveFile Dialog ]
: 사옹자에게 파일을 저장할 위치를 선택하라는 메시지를 표시한다. (이 클래스는 상속될 수 없다.)

# FileName 속성 : 파일 대화 상자에서 선택한 파일 이름을 포함하는 문자열을 가져오거나 설정한다.
# Filter 속성 : 대화 상자에서 "파일 형식으로 저장" 또는 "파일 형식" 상자에 표시되는 선택 옵션을 결정하는 현재 파일 이름 필터 문자열을 가져오거나 설정한다.
# ShowDialog 메서드 : 기본 소유자로 일반 대화 상자를 실행한다.

 SFDialog.FileName = "*.txt" // 파일 이름

 SFDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" // 파일 형식 (파일 목록 필터링)

 SFDialog.ShowDialog(); 

 

 if (SFDialog.ShowDialog() == DialogResult.OK) // 만약 DialogResult가 OK(저장)이 클릭되면

 {

   strFilePath = SFDialog.FileName; // SFDialog의 FileNmae을, strFilePath에 넣는다.

 

/* StreamWriter를 이용해서 텍스트 파일을 쓰는 부분을 구현 */

   // StreamWriter swFDialog = new StreamWriter(strFilePath);

      // StreamWriter타입의 swFDialog객체에, strFilePath값을 지닌 객체를 생성해서 담는다.

   // swFDialog.WriteLine(tboxConfigData.Text);

      // swFDialog객체의 텍스트 스트림에, tboxConfigData의 Text부분을 쓴다. 

   // swFDialog.Close();

     // swFDialog 객체 내부 스트림을 닫는다.

 

/* WriteAllText를 이용해서 위의 세 줄을 한 줄로 구현 */

   File.WriteAllText(strFilePath, tboxConfigData.Text);

 // strFilePath경로로, tboxConfigData.Text내용을 Text File로 저장

 }

}

 

 

private void btnLoad_Click(object sender, EventArgs e) // Text 읽어오기 버튼을 클릭했을 때

{

 string strFilePath = string.Empty; // 저장할 때 파일 경로 변수

 OFDialog.InitialDirectory = Application.StartupPath; // 다이얼로그가 Open 되었을 때, 최초의 경로 설정

 OFDialog.FileName = "*.txt" // 파일 이름

 OFDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" // 파일 형식

 

 StringBuilder sb = new StringBuilder(); 

 

 if (OFDialog.ShowDialog() == DialogResult.OK) // 만약 DialogResult가 저장이 되면

 {

   strFilePath = OFDialog.FileName; // OFDialog의 FileName을, strFilePath 변수에 저장한다.

 

/* StreamReader를 이용해서 텍스트 파일을 읽는 부분을 구현 */

   // StreamReader srOFDialog = new StreamReader(strFilePath, Encoding.UTF8, true);

       // strFielPath.Encoding.UTF8 : 인코딩 방식

       // StreamReader타입의 srOFDialog 객체에, strFilePath, Encoding.UTF8, true의 값을 지닌 객체를 생성해 담는다.

   // while (srOFDialog.EndOfStream == false)

       // srOFDialog 객체의 현재 스트림 위치가, 스트림의 끝에 있는지를 나타내는 값을 가져온다. 즉, 마지막줄이 아니면 계속 돌게 된다.

   // {

     // sb.Append(srOFDialog.ReadLine());

     // sb.Append("\r\n");

   //}

 

/* ReadAllText를 이용해서 위의 세 줄을 한 줄로 구현 */

   sb.Append(File.ReadAllText(strFilePath)); // 텍스트 파일을 String 형태로 한 번에 읽어 옴.

   // string[] dd = File.ReadAllLines(strFilePath); // 텍스트 파일을 한 줄 씩, string 배열 형태로 한 번에 읽어 옴

 

   tboxConfigData.Text = sb.ToString();

 }

}

 

private void btnConfigRead_Click(object sender, EventArgs e) // Config 가져오기 버튼을 눌렀을 때

{

 string[] strConfig = tboxConfigData.Text.Split(new char[] { '\r', '\n' },StringSplitOptions.RemoveEmptyEntries);

* \r : 줄 맨 앞 이동
* \n : 다음 줄 이동
* RemoveEmptyEntries : 객체(인스턴스)의 길이가 0인 경우에는, 빈 배열을 반환한다.

 tboxData.Text = strConfig[0];

 cboxData.Checked = bool.Parse(strConfig[1]);

 numData.Value = int.Parse(strConfig[2]);

}

 

}

}

 

 


3. 결과물 부분


4. C#기초 예시 / 참고 자료를 더 보고 싶다면?


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형