[프로그램 개요]
- ini 파일을 읽고 수정할 수 있다.
1. 파일을 읽는다.
2. 파일을 조회한다.
3. 파일을 수정한다.
4. 파일을 저장한다.
# 피드백
1. 리스트 원리
2. 주석은 나를 위해 다는 것
3. 좀 더 개발속도 높이기 = 개인시간 할애하기(정공법)
4. 기능수행 검증하면서 하기
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO; // 파일스트림
using System.Windows.Forms; // OpenFileDialog
using System.Runtime; // Trim
namespace IniProgram
{
public partial class Test : Form
{
// < 변수 모음 >
string filePath; // 파일경로 (다양한 함수에서 써야하니 전역으로 둔다)
int lineCount; // 파일이 총 몇줄인지 카운트
// 파싱한걸 담을 변수들
string allFile;
char section; // 섹션을 저장하는 변수
char key; // 키를 저장하는 변수
char value; // 값을 저장하는 변수
List<char> sections; // char형 리스트 배열 (동적할당)
List<char> keys;
List<char> values;
public Test()
{
InitializeComponent();
}
// 1. 파일열기 //////////////////////////////////////////////////////////////////////////
private void btn_open_Click(object sender, EventArgs e)
{
// sender = 이벤트를 보내는 객체
// e = 이벤트 핸들러가 사용하는 파라미터
// 이벤트 핸들러를 추가하는 가장 간단한 방식 = 더블클릭
OpenFileDialog ofd = new OpenFileDialog(); // 파일 대화상자 객체 생성
if (ofd.ShowDialog() == DialogResult.OK) // ofd가 대화상자를 띄움
{
filePath = ofd.FileName; // 경로를 저장하는 변수에 파일명 저장
//MessageBox.Show("선택한 파일: " + filePath);
}
// [파일읽기]
allFile = File.ReadAllText(filePath); // 변수에 파일내용 다 넣기
lineCount = File.ReadAllLines(filePath).Length; // 파일이 몇줄인지
Console.WriteLine($"줄수:" + lineCount); // for문 돌릴 때 필요함
tb_allFile.Text = allFile; // ui 표시
pasingFile(filePath, allFile);// 파일 읽었으니까 이제 파싱
}
// 2. 파싱하기 //////////////////////////////////////////////////////////////////////////
private void pasingFile(string filePath, string allFile)
{
Console.WriteLine($"(전)allFile=" + '\n' + allFile); // 현재 담은 데이터 찍어보기 (뭐들어있나)
// 인스턴스 생성 (메모리 할당)
sections = new List<char>();
keys = new List<char>();
values = new List<char>();
// 본격 파싱 조건문
for (int i=0; i<lineCount; i++) // 줄수만큼 반복 (한줄한줄 읽기)
{
allFile.Replace("\n", ""); // 개행 제거
allFile.Trim(); // 문자열 앞뒤 공백 제거
allFile.Trim('\n'); // 개행 제거
//Console.WriteLine($"allFile 수정 후: " + allFile);
string[] data = allFile.Split('\n'); //한줄씩 배열에 저장(인덱스로 꺼내쓰기)
data[i].Trim(); // 한줄씩 앞뒤 공백 제거
data[i].Replace(" ", " "); // 한줄씩 개행있으면 제거
if (string.IsNullOrWhiteSpace(data[i])) // 빈줄 제거 시도
{
continue;
}
// (1). 섹션 파싱
if (data[i][0] == '[') // [ 로 시작하는 줄이면 섹션임
{
section = data[i][1]; // 섹션의 경우 [0],[1],[2] 중 [1]만 추출
Console.WriteLine("추출한 섹션값: " + section);
sections.Add(section); // 섹션 리스트에 추가
}
else
{
// (2). 키,값 파싱
//if (data[i][1] == '=' && data[i][0] != ' ') // 가운데에 = 이 있고, 첫번째가 공백이 아님
if (data[i][1] == '=') // 가운데에 = 이 있음
{
key = data[i][0]; // = 앞에가 키
keys.Add(key);
value = data[i][2]; // = 뒤에가 값
values.Add(value);
Console.WriteLine("추출한 키/값: " + key + '/' + value);
}
}
}
foreach (char s in sections)
{
Console.WriteLine("sections: " + sections); // 파싱한 섹션값 출력하기
}
// [파싱값 ui에 띄우기]
showData(sections, keys, values);
}
// 3. 데이터 띄우기 //////////////////////////////////////////////////////////////////////////
private void showData(List<char> s, List<char> k, List<char> v)
{
string ss;
s.ToString();
}
// 4. 저장하기 //////////////////////////////////////////////////////////////////////////
private void saveFile(string filePath, string allFile)
{
// 특정 요소만 저장하면되니까 for문
File.WriteAllText(filePath, allFile); // 지정 파일경로에 저장한 파일을 저장
}
}
}