IT/C#

[C#] Text, CSV 등 파일 저장하기/열기 (SaveFileDialog, OpenFileDialog, StreamWriter, SteamReader, Encoding, using 구문)

Ella.J 2023. 8. 23. 21:26
728x90
반응형

 

C# Winform을 활용하여

1. 텍스트박스의 내용을 저장하거나

2. 파일을 읽어 텍스트박스에 넣어보겠습니다.

 

일단 Winform .NET Framework 프로젝트를 생성해 주고,

Form 디자인은 다음과 같이 했습니다.

  • txt : TextBox
  • btnOpenFile : Button
  • btnSaveFile : Button

 

 

그리고 각 버튼에 Click 이벤트를 등록해 주고, 다음과 같이 입력합니다.

 

 

OpenFileDialog

: 사용자가 파일을 열도록 요청하는 표준 대화 상자를 표시합니다.

- ofd.ShowDialog() : 파일 선택창 열기

- DialogResult.OK : 열 파일 선택 완료

- ofd.FileName : 파일 대화 상자에서 선택한 파일 이름을 포함하는 파일 경로 문자열

StreamReader

: 특정 인코딩의 바이트 스트림에서 문자를 읽는 TextReader를 구현합니다.

- sr.EndOfStream : 현재 스트림의 위치가 스트림의 끝에 있으면 true, 없으면 false. 파일 끝까지 읽었는지 아닌지 체크하기 위해 사용.

- sr.ReadLine() : 현재 스트림에서 한 줄의 문자를 읽고 데이터를 문자열로 변환합니다.

 

SaveFileDialog

: 파일을 저장할 위치를 선택하라는 메시지입니다.

- sfd.ShowDialog() : 파일 위치 선택창 열기

- DialogResult.OK : 파일 저장 위치 선택 완료

- sfd.FileName : 파일 대화 상자에서 선택한 파일 이름을 포함하는 파일 경로 문자열

StreamWriter

: 구현하는 TextWriter 특정 인코딩의 스트림에 문자를 작성합니다.

- sr.WriteLine("text") : 문자열과 줄 종결자를 차례로 텍스트 문자열 또는 스트림에 씁니다.

 

 

* using(...) { } 구문을 사용하면, 해당 블록에서 스트림 객체를 사용하고 블록이 끝나면 할당된 객체를 자동으로 Dispose 해제해 줍니다.

 

 

텍스트 파일 저장하기.

 

텍스트 파일 읽기.

 

 

CSV 파일 저장하기.

 

CSV 파일 읽기.

 

* 주의사항 *

위의 코드에서

StreamReader sr = new StreamReader(ofd.FileName),

StreamWriter sw = new StreamWriter(sfd.FileName)을 그대로 사용하면,

CSV 사용 시 Encoding이 정해지지 않아 위 사진들과 같이 한글이 깨지는 현상이 있습니다.

따라서 다음과 같이 StreamReader, StreamWriter 객체 생성 시 인코딩을 따로 지정해줘야 합니다.

StreamReader sr = new StreamReader(ofd.FileName, Encoding.Default)

StreamWriter sw = new StreamWriter(sfd.FileName, true, Encoding.Default)

 

다시 실행하면 위와 같이 한글이 깨지지 않고 잘 나옵니다.

 

 

전체 코드.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.IO;
using System.Text;
using System.Windows.Forms;
 
namespace OpenSaveFile
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void btnOpenFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                using (StreamReader sr = new StreamReader(ofd.FileName, Encoding.Default))
                {
                    string data = "";
                    while (!sr.EndOfStream)
                    {
                        data += sr.ReadLine() + "\r\n";
                    }
                    txt.Text = data;
                }
            }
        }
 
        private void btnSaveFile_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            if (sfd.ShowDialog() == DialogResult.OK)
            {
                using (StreamWriter sw = new StreamWriter(sfd.FileName, trueEncoding.Default))
                {
                    sw.WriteLine(txt.Text);
                }
            }
        }
    }
}
 
cs

 

 

728x90
반응형