C#,Delphi,Oracle,MSSQL 개발자블로그
[C#]텍스트파일에 쓰기/읽기/수정/삭제하기. 본문
1.텍스트 파일에 쓰기.
using System.IO;
StreamWriter sw = new StreamWriter("C:\\Users\\user\\Desktop\\Test.txt",true);
sw.WriteLine("Hello. World !");
sw.Close();
위는 바탕화면의 'Test.txt'라는 텍스트파일에 'Hello. World!'라는 말을 써 넣는 간단한 소스입니다.
텍스트 파일에 저장 하는 것은 위의 3줄만 있으면 간단히 할 수 있습니다.
StreamWriter를 사용하기위해 System.IO를 using 시켜줍니다.
StreamWrite 내부의 true값은, sw.WriteLine을 통해 문자를 새로 작성 시, 기존의 텍스트파일 뒤에 추가로 데이터를 쓴다는 뜻입니다.
이 부분을 false로 바꾸어 준다면, 텍스트파일에 새로 쓸 때마다, 기존의 데이터가 없어지고 새롭게 데이터가 쓰여지게 됩니다.
Tip ) 파일의 저장 경로 간단하게 알기.
예를 들어, 바탕화면의 저장 경로를 알고 싶다면, 바탕화면 내 아무 폴더의 속성을 보면 됩니다.
위와 같이, 파일에서 우클릭->속성->일반 탭으로 가면 보기쉽게 파일의 위치를 알 수 있습니다. 또한 복사, 붙여넣기가 가능하니 쉽게 경로를
찾아 이용할 수 있습니다. 위 사진은 필자의 컴퓨터의 바탕화면 경로를 예시로 든 것입니다.
2.텍스트 파일 읽기.
string[] lines;
int readNum = (int)nudReadNum.Value;
lines = File.ReadAllLines("C:\\Users\\user\\Desktop\\Test.txt");
if (readNum < lines.Length) //데이터가 존재하는 라인일 때에만, label에 출력한다.
lblReadLine.Text = lines[readNum];
else
MessageBox.Show("존재하지 않는 라인입니다.");
텍스트 파일 읽기의 여러가지 방법 중 한가지인, 파일 전체를 읽는 방법입니다.
lines라는 배열을 선언하고, 그 안에 File.ReadAllLines를 통하여 해당 경로에 있는 파일 내 데이터를 모두 담습니다.
이 때, lines 배열은 텍스트 파일의 줄 수만큼 생성이 됩니다.
예를 들어, 텍스트 파일 내에 글이 다섯줄이 있다면, lines는 lines[0], lines[1], lines[2], lines[3], lines[4] 의 다섯 개가 생성되고 각각의 배열 값들은 해당 줄의 모든 글자를 저장합니다.
3.텍스트파일 수정 하기.
sw = new StreamWriter("C:\\Users\\user\\Desktop\\Test.txt", false);
if (count == 0)
{
sw.WriteLine(txtRevisionNext.Text);
for(int i = 1; i < lines.Length; i++)
{
sw.WriteLine(lines[i]);
}
sw.Close();
MessageBox.Show("수정되었습니다.");
}
else
{
for(int i = 0; i < count; i++)
{
sw.WriteLine(lines[i]);
}
sw.WriteLine(txtRevisionNext.Text);
for(int i = count+1; i < lines.Length; i++)
{
sw.WriteLine(lines[i]);
}
sw.Close();
MessageBox.Show("수정되었습니다.");
}
텍스트 파일의 수정은 기본적으로, replace 함수처럼 일부분만 바꾸는 것이 아닌 전체를 다시 쓰는 것으로 합니다.
예를들어, 자신이 총 10줄의 텍스트파일 내용 중 3번째 줄을 수정하고 싶다면,
1~2번째 줄 : 원래의 내용 그대로 쓰기.
3번째 줄 : 수정한 내용 쓰기.
4~10번째 줄 : 원래의 내용 그대로 쓰기.
의 순서로 이루어 집니다.
sw = new StreamWriter("C:\\Users\\user\\Desktop\\Test.txt", false); 구문은 StreamWriter의 두번 째 인자 값을 false로 주어서,
기존의 텍스트파일 위에 덮어쓰는 형태가 되어 기존의 데이터는 사라지고, 새로 쓰는 데이터가 저장되게 됩니다.
데이터를 쓸 때에는 if문을 주어서 , 수정하려는 행이 텍스트파일의 가장처음인지 아닌지를 구분하여 씁니다.
그 이유는, for문을 이용하여 데이터를 쓰기 때문입니다.
수정하려는 행이 가장 처음 행일 때, (즉, 텍스트 파일의 라인 수를 담는 배열의 인자값이0 일 때) for문이 for( int i = 0 ; i < 0 ; i++)꼴이 되어
오류가 나게 됩니다.
4.텍스트 파일 삭제하기.
sw = new StreamWriter("C:\\Users\\user\\Desktop\\Test.txt", false);
if (countDelete == 0)
{
for (int i = 1; i < lines.Length; i++)
{
sw.WriteLine(lines[i]);
}
sw.Close();
MessageBox.Show("삭제되었습니다.");
}
else
{
for (int i = 0; i < countDelete; i++)
{
sw.WriteLine(lines[i]);
}
for (int i = countDelete + 1; i < lines.Length; i++)
{
sw.WriteLine(lines[i]);
}
sw.Close();
MessageBox.Show("삭제되었습니다.");
}
텍스트 파일의 삭제는 수정할 때와 99% 똑같습니다. 수정하기의 원리가 '수정할 텍스트 파일 내 행만 다시 쓰고', 나머지 데이터를 그대로
덮어 쓴다면, 삭제는 '수정할 텍스트 파일 내 행만 안쓰고' 나머지 데이터를 그대로 쓰는 것입니다.
다음은 전체 소스 입니다.
namespace TextFileTest
{
public partial class Form1 : Form
{
string[] lines = File.ReadAllLines("C:\\Users\\user\\Desktop\\Test.txt");
StreamWriter sw;
int countRevision = 0;
int countDelete = 0;
public Form1()
{
InitializeComponent();
}
//저장 버튼
private void btnSave_Click(object sender, EventArgs e)
{
sw = new StreamWriter("C:\\Users\\user\\Desktop\\Test.txt", true);
sw.WriteLine(txtWrite.Text);
sw.Close();
MessageBox.Show("저장되었습니다 !");
}
//읽기 버튼
private void btnRead_Click(object sender, EventArgs e)
{
int readNum = (int)nudReadNum.Value;
if (readNum < lines.Length) //데이터가 존재하는 라인일 때에만, label에 출력한다.
lblReadLine.Text = lines[readNum];
else
MessageBox.Show("존재하지 않는 라인입니다.");
}
//수정할 텍스트 검색
private void btnSearchRevision_Click(object sender, EventArgs e)
{
txtRevisionPrev.Text = lines[0];
}
//이전 버튼(수정)
private void btnPrev_Click(object sender, EventArgs e)
{
lines = File.ReadAllLines("C:\\Users\\user\\Desktop\\Test.txt");
countRevision--;
if (countRevision < 0)
{
MessageBox.Show("마지막 문자열 입니다.");
countRevision = 0;
return;
}
txtRevisionPrev.Text = lines[countRevision];
}
//다음 버튼(수정)
private void btnNext_Click(object sender, EventArgs e)
{
lines = File.ReadAllLines("C:\\Users\\user\\Desktop\\Test.txt");
countRevision++;
if(countRevision > lines.Length-1)
{
MessageBox.Show("마지막 문자열 입니다.");
countRevision = lines.Length - 1;
return;
}
txtRevisionPrev.Text = lines[countRevision];
}
//수정하기 버튼
private void btnRevision_Click(object sender, EventArgs e)
{
sw = new StreamWriter("C:\\Users\\user\\Desktop\\Test.txt", false);
if (countRevision == 0)
{
sw.WriteLine(txtRevisionNext.Text);
for(int i = 1; i < lines.Length; i++)
{
sw.WriteLine(lines[i]);
}
sw.Close();
MessageBox.Show("수정되었습니다.");
}
else
{
for(int i = 0; i < countRevision; i++)
{
sw.WriteLine(lines[i]);
}
sw.WriteLine(txtRevisionNext.Text);
for(int i = countRevision + 1; i < lines.Length; i++)
{
sw.WriteLine(lines[i]);
}
sw.Close();
MessageBox.Show("수정되었습니다.");
}
}
//삭제할 텍스트 검색
private void btnSearchDelete_Click(object sender, EventArgs e)
{
txtDelete.Text = lines[0];
}
//이전 버튼(삭제)
private void btnPrevDelete_Click(object sender, EventArgs e)
{
lines = File.ReadAllLines("C:\\Users\\user\\Desktop\\Test.txt");
countDelete--;
if (countDelete < 0)
{
MessageBox.Show("마지막 문자열 입니다.");
countDelete = 0;
return;
}
txtDelete.Text = lines[countDelete];
}
//다음 버튼 (삭제)
private void btnNextDelete_Click(object sender, EventArgs e)
{
lines = File.ReadAllLines("C:\\Users\\user\\Desktop\\Test.txt");
countDelete++;
if (countDelete > lines.Length - 1)
{
MessageBox.Show("마지막 문자열 입니다.");
countDelete = lines.Length - 1;
return;
}
txtDelete.Text = lines[countDelete];
}
//삭제 버튼
private void btnDelete_Click(object sender, EventArgs e)
{
sw = new StreamWriter("C:\\Users\\user\\Desktop\\Test.txt", false);
if (countDelete == 0)
{
for (int i = 1; i < lines.Length; i++)
{
sw.WriteLine(lines[i]);
}
sw.Close();
MessageBox.Show("삭제되었습니다.");
}
else
{
for (int i = 0; i < countDelete; i++)
{
sw.WriteLine(lines[i]);
}
for (int i = countDelete + 1; i < lines.Length; i++)
{
sw.WriteLine(lines[i]);
}
sw.Close();
MessageBox.Show("삭제되었습니다.");
}
}
}
}
'Programming > C#' 카테고리의 다른 글
C# 원하는 길이로 좌측/우측 정렬시킨후 나머지 공간을 다른 문자로 채우기(pad) (0) | 2017.03.12 |
---|---|
스레드 다루기 - 1. 스레드의 개념이해 (0) | 2017.03.12 |
C#에서 저장 프로시저 호출 (0) | 2017.03.12 |
C# DateTime 날짜 관련 클래스 (0) | 2017.03.12 |
VS [제약조건과 일치하는 올바른 내보내기를 찾을 수 없습니다.] 해결방법. (0) | 2017.03.11 |