C#,Delphi,Oracle,MSSQL 개발자블로그

[C#]텍스트파일에 쓰기/읽기/수정/삭제하기. 본문

Programming/C#

[C#]텍스트파일에 쓰기/읽기/수정/삭제하기.

19760323 2017. 1. 27. 00:14

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("삭제되었습니다.");
            }
        }
    }
}

 

TextFileTest.zip

 

 

 

 

Comments