본문 바로가기
개발일지/C#

파일 파싱 예제

by 태운콩즙 2024. 11. 11.
728x90
반응형

프로그램이 특정 폴더를 계속 계속해서 읽고 그 폴더 안에 파일이 생성 되었을 때 그 파일의 내용을 읽고 그 파일을 복사 이동 삭제하는 기능을 만들어 보았다

using System;
using System.IO;
using System.Text;
using System.Windows.Forms;

namespace FolderReader_test
{
    public partial class Form1 : Form
    {
        public string ReadFolder = "읽기 전용 폴더 경로";
        public string BackupFolder = "이동 전용 폴더 경로";
        private FileSystemWatcher fw;
        public Form1()
        {
            InitializeComponent();
            FileWatcher(); 
        }
        private void FileWatcher()
        {
            // 폴더 안에 모든 txt 파일 읽음
            fw = new FileSystemWatcher(ReadFolder, "*.txt")
            {
                NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite  // 파일 이름 | 마지막으로 쓰여진 파일 확인 필터 적용
            };
            fw.Created += FileCreated; // 파일이 생성 되었을때
            fw.EnableRaisingEvents = true; // 이벤트 발생
        }
        // 파일 생성시 처리
        private void FileCreated(object sender, FileSystemEventArgs e)
        {
            // 파일 읽고 dataGridView에 추가
            Invoke(new Action(() =>
            {
                FileContentView(e.FullPath);
                MoveFile(e.FullPath);
            }));
        }
        private void FileContentView(string path)
        {
            try
            {
                // 파일을 읽고 줄단위 구분
                string[] line = File.ReadAllLines(path, Encoding.Default);
                foreach (var line2 in line)
                {
                    // 각 줄을 공백으로 분리하여 내용 나눔
                    string[] part = line2.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
                    if (part.Length >= 2)
                    {
                        dataGridView1.Rows.Add(part[0], part[1]);
                    }
                    // 공백일 경우 N/A 로 표기
                    //else
                    //{
                    //    dataGridView1.Rows.Add(part[0], "N/A");
                    //}
                }
            }
            catch(Exception ex) 
            {
                MessageBox.Show($"파일을 읽는중 에러가 발생했습니다:{ex.Message}");
            }
        }
        private void MoveFile(string path)
        {
            try
            {
                string fileName = Path.GetFileName(path);
                string destinationPath = Path.Combine(BackupFolder, fileName);

                // 파일을 백업 폴더로 이동
                File.Copy(path, destinationPath, true);
                // 읽기 폴더에 있는 파일 삭제
                File.Delete(path);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"파일을 이동하는중 에러 발생: {ex.Message}");
            }
        }
        // 폼이 열리면 폴더 읽기
        private void Form1_Load(object sender, EventArgs e)
        {
            // dataGridView 크기 조정
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
            //dataGridView 컬럼
            dataGridView1.Columns.Add("FileContent", "측정 내용");
            dataGridView1.Columns.Add("FileContent", "측정 값");
            // FileSystemWatcher 경로
            fw.Path = ReadFolder;
        }
    }
}

우선 전체적인 코드 구조이다

FileSystemWatcher 는System.IO에 속한 클래스로 폴더 내의 파일과 폴더의 변화를 감지 할 수 있다

 private void FileWatcher()
 {
     // 폴더 안에 특정 파일 읽음
     fw = new FileSystemWatcher(ReadFolder, "*.txt")
     {
         NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite  // 파일 이름 | 마지막으로 쓰여진 파일 확인 필터 적용
     };
     fw.Created += FileCreated; // 파일이 생성 되었을때
     fw.EnableRaisingEvents = true; // 이벤트 발생
 }

우선 FileWatcher 이라는 메서드를 생성 하고 그 안에 폴더의 경로와 특정 파일을 지정하여 파일이 생성 되었을 때 이벤트를 발생 시켰다

<FileCreated>

// 파일 생성시 처리
private void FileCreated(object sender, FileSystemEventArgs e)
{
    // 파일 읽고 dataGridView에 추가
    Invoke(new Action(() =>
    {
        FileContentView(e.FullPath); // 파일의 내용을 보여준다
        MoveFile(e.FullPath); // 파일을 이동한다
    }));

파일이 생성되면 dataGridView에 파일의 내용을 출력해주고 파일을 백업 폴더로 이동 하게 구현하였다

<FileContentView>

private void FileContentView(string path)
{
    try
    {
        string[] line = File.ReadAllLines(path, Encoding.Default);
        foreach (var line2 in line)
        {
            // 각 줄을 공백으로 분리하여 내용 나눔
            string[] part = line2.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
            if (part.Length >= 2)
            {
                dataGridView1.Rows.Add(part[0], part[1]);
            }
            // 공백일 경우 N/A 로 표기
            //else
            //{
            //    dataGridView1.Rows.Add(part[0], "N/A");
            //}
        }
    }
    catch(Exception ex) 
    {
        MessageBox.Show($"파일을 읽는중 에러가 발생했습니다:{ex.Message}");
    }
}

파일을 읽고 내용을 출력 해주고 각 줄을 공백으로 분리하여 내용을 나누어 주었다 주석의 경우 공백 일 경우 표기 하는 것 이다

<MoveFile>

private void MoveFile(string path)
{
    try
    {
        string fileName = Path.GetFileName(path);
        string destinationPath = Path.Combine(BackupFolder, fileName);

        // 파일을 백업 폴더로 이동
        File.Copy(path, destinationPath, true);
        // 읽기 폴더에 있는 파일 삭제
        File.Delete(path);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"파일을 이동하는중 에러 발생: {ex.Message}");
    }
}

<Form1_Load>

        // 폼이 열리면 폴더 읽기
        private void Form1_Load(object sender, EventArgs e)
        {
            // dataGridView 크기 조정
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
            //dataGridView 컬럼
            dataGridView1.Columns.Add("FileContent", "측정 내용");
            dataGridView1.Columns.Add("FileContent", "측정 값");
            // FileSystemWatcher 경로
            fw.Path = ReadFolder;
        }
    }
}

폼이 열리면 폴더를 계속 읽게 만들었다

dataGridView 의 크기와 컬럼의 행을 만들어주었다

728x90
반응형

'개발일지 > C#' 카테고리의 다른 글

윈폼 예제  (0) 2024.11.13
텍스트 형태의 파일 입출력 예제  (0) 2024.11.12
회계 관리 프로그램 예제  (1) 2024.11.09
인사 급여 관리 프로그램 예제  (0) 2024.11.08
C# Delegate  (2) 2024.10.02