C# 에서 텍스트 파일을 열어서 라인수로 파일을 분할하는 프로그램을 만들어 보겠습니다.
1. 프로젝트 생성
1). 새프로젝트 만들기를 한후, Windows Forms 앱(Net Framework)을 선택한 후,
2). 새프로젝트 구성에서 프로젝트 이름과 위치를 설정하고 만들기 버튼을 누르면 기본 윈도우가 생성됩니다.
2. 파일합치기 윈 폼을 아래 그림과 같이 만들어 줍니다.
1). TextBox : filesum_textBox (폴더 경로)
2). TextBox : filesum_out_textBox (저장 경로)
3). Button: fileselect_button
4). Button: filesum_button
5). richTextBox : filesum_richTextBox
3. 파일 선택 다이얼로그 만들기
우선적으로 윈도움 폼에서 파일 경로 선택 버튼을 더블 클릭해서, 버튼 클릭시 실행하는 함수를 만듭니다.
이 함수에서는 폴더를 선택하는 다이얼로그을 이용하여 폴더 경로를 얻어 옵니다.
// 파일 경로 선택 버튼 - 파일 경로 다이얼로그
private void filepath_button_Click(object sender, EventArgs e)
{
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
//MessageBox.Show(folderBrowserDialog.SelectedPath);
filesum_textBox.Text = String.Format("{0}", folderBrowserDialog.SelectedPath);
Log_print("폴더 경로: "+ filesum_textBox.Text);
}
}
4. 파일 합치기 버튼 클릭시 - 파일 합치기 함수 만들기
파일을 합치는 방법은 위에서 얻어온 파일들이 있는 경로에서
계속적으로 루프를 돌려서 파일을 읽고, 출력파일에 저장하고, 다른 파일을 읽어서 출력파일에 저장한다는 기본 개념을 가지고 있으면 쉽게 구현가능합니다.
1). 폴더 아래 있는 파일을 합치려면 우선적으로 폴더 아래의 파일 목록을 가져와야 합니다.
아래 코드는 inputfoldername1 경로 아래의 모든 파일의 목록을 출력하는 예제 입니다.
string[] tmpfiles = Directory.GetFiles(inputfoldername1, "*.*");
foreach (string tempFile in tmpfiles)
{
Console.WriteLine(tempFile);
}
2). 특정 폴더 아래 파일을 읽어서 한개의 파일에 저장하기.
여기에 위 코드에서 경로에서 파일 목록을 얻었으며, 한 파일씩 읽고 특정 파일에 저장하는것을 반복하면됩니다.
해당 코드는 아래와 같습니다.
// 파일 합치기 - 파일합치기 버튼
private void filesum_button_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(filesum_textBox.Text))
{
Log_print("폴더 경로가 선택되지 않았습니다!!");
}
else
{
MergeFile(filesum_textBox.Text);
}
}
// 파일 합치기 함수
public bool MergeFile(string inputfoldername1)
{
bool Output = false;
int file_cnt = 0;
try
{
string[] tmpfiles = Directory.GetFiles(inputfoldername1, "*.*");
string output_filename = "";
if (String.IsNullOrEmpty(filesum_out_textBox.Text))
{
output_filename = SaveFileFolder + @DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".txt";
Log_print("출력 파일이 지정되지 않았습니다.!!");
Log_print(String.Format("{0}로 설정합니다.",output_filename));
filesum_out_textBox.Text = output_filename;
}
else
{
output_filename = filesum_out_textBox.Text;
}
var outPutFile = new StreamWriter(output_filename);
foreach (string tempFile in tmpfiles)
{
file_cnt++;
Log_print(tempFile);
var sr = new StreamReader(tempFile);
string line;
while ((line = sr.ReadLine()) != null)
{
outPutFile.WriteLine(line);
}
//outPutFile.WriteLine();
sr.Close();
}
outPutFile.Close();
Log_print("파일 합치기 완료!!");
}
catch
{
}
return Output;
}
6. 특정 폴더 아래 파일을 한개의 파일로 합치는 프로그램의 전체 코드입니다.
// 파일 경로 선택 버튼 - 파일 경로 다이얼로그
private void filepath_button_Click(object sender, EventArgs e)
{
FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
//MessageBox.Show(folderBrowserDialog.SelectedPath);
filesum_textBox.Text = String.Format("{0}", folderBrowserDialog.SelectedPath);
mergeFolder = String.Format("{0}", folderBrowserDialog.SelectedPath);
Log_print("폴더 경로: "+ filesum_textBox.Text);
}
}
// 파일 합치기 - 파일합치기 버튼
private void filesum_button_Click(object sender, EventArgs e)
{
if (String.IsNullOrEmpty(filesum_textBox.Text))
{
Log_print("폴더 경로가 선택되지 않았습니다!!");
}
else
{
MergeFile(filesum_textBox.Text);
}
}
// 파일 합치기 함수
public bool MergeFile(string inputfoldername1)
{
bool Output = false;
int file_cnt = 0;
try
{
string[] tmpfiles = Directory.GetFiles(inputfoldername1, "*.*");
string output_filename = "";
if (String.IsNullOrEmpty(filesum_out_textBox.Text))
{
output_filename = SaveFileFolder + @DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + ".txt";
Log_print("출력 파일이 지정되지 않았습니다.!!");
Log_print(String.Format("{0}로 설정합니다.",output_filename));
filesum_out_textBox.Text = output_filename;
}
else
{
output_filename = filesum_out_textBox.Text;
}
var outPutFile = new StreamWriter(output_filename);
foreach (string tempFile in tmpfiles)
{
file_cnt++;
Log_print(tempFile);
var sr = new StreamReader(tempFile);
string line;
while ((line = sr.ReadLine()) != null)
{
outPutFile.WriteLine(line);
}
//outPutFile.WriteLine();
sr.Close();
}
outPutFile.Close();
Log_print("파일 합치기 완료!!");
}
catch
{
}
return Output;
}
//--------------------------
// 로그
//--------------------------
private void Log_print(string str_msg)
{
filesum_richTextBox.AppendText(str_msg + Environment.NewLine);
filesum_richTextBox.ScrollToCaret();
}
'공학속으로 > C#' 카테고리의 다른 글
c# 타이머(Timer) 구성 요소 (0) | 2023.04.03 |
---|---|
c# 텍스트박스(TextBox) 에디트박스 사용법 정리 (0) | 2023.04.02 |
C# 텍스트 파일 라인수로 분할하여 저장하기 (0) | 2023.03.06 |
c# DataGridView의 데이터를 엑셀파일로 저장하는 예제 (0) | 2021.12.21 |
c# DataGridView 내용을 csv 파일로 저장하기 (0) | 2021.12.21 |
댓글