[문과 코린이의 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#기초 예시 / 참고 자료를 더 보고 싶다면?
* 유의사항 - 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다. - 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다. - 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :) |