현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.

 Mir의 운영환경

 본체

 DeskTop

 O S

 Windows XP Professional Version 2002 Service Pack 2

 Application

 VisualStudio2005 (Ver.8.0.50727.42)

 .Net

 Framework Ver 2.0

텍스트 파일 읽기(System.IO.StreamReader)


StreamReader를 이용하여 텍스트 파일을 읽어오자.

(참조 : https://msdn.microsoft.com/ko-kr/library/system.io.streamreader(v=vs.110).aspx)

 

StreamReader는 소용량의 문자열기반 데이터를 문장단위로 처리할때 유용한 Class이며 FileStream의 읽기 전용 헬퍼 개념입니다.
FileStream으로도 StreamReader에서 수행하는 모든 작업을 할수 있으나 귀찮은 부분(Byte To String 등)을 빠르고 간편하게 할수 있도록 도와주는게 StreamReader입니다. (StreamWriter도 마찬가지...)


일반적인 단순한 작업 (텍스트 파일을 읽고 화면에 한번 출력 하는 작업)은 StreamReader를 사용하면 편하고 빠르지만 일반적이지 않은 상황 (파일을 읽어 해당 정보를 여러번 읽어 출력하거나 버퍼에서 byte단위로 변환 하여 분리하던가 등등) 조금 복잡한 로직이거나 대용량 파일일 경우 FileStream을 사용하거나 혼용하여 사용하는게 안정적입니다.
(MSDN에서도 남용을 하면 심각한 성능저하가 일어날수도 있다고 명시되어있답니다.)

 

 

- 예제 -

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

namespace MirTest
{
    public partial class Main : Form
    {

        public Main()
        {
            InitializeComponent();

            //c:\test.txt 파일을 읽어 sr에 저장
            StreamReader sr = ReadFile("C:", "test.txt");
            if (sr != null) {
                //ReadToEnd 메소드 호출
                MirReadToEnd(sr);
                //버퍼 닫기
                sr.Close();
            }

            //c:\test.txt 파일을 읽어 sr에 저장
            sr = ReadFile("C:", "test.txt");
            if ( sr != null ) {
                //ReadLine 메소드 호출
                MirReadLine(sr);
                //버퍼 닫기
                sr.Close();
            }

        }


        /// 
        /// 파라미터로 받은 디렉토리와 FileName을 이용하여 해당 파일을 읽어온다.
        /// 
        /// 읽어올 파일 디렉토리
        /// 읽어올 파일 이름
        /// 파일이 있을경우 StreamReader 없을경우 Null
        public StreamReader ReadFile(string mir_directory, string mir_fileName)
        {
            //해당 디렉토리가 존재하지 않으면 Null 리턴
            DirectoryInfo di = new DirectoryInfo(mir_directory);
            if (!di.Exists) { return null; }

            //해당 디렉토리에 파일이 존재 하지 않으면 Null 리턴
            FileInfo fi = new FileInfo(mir_directory + @"\" + mir_fileName);
            if (!fi.Exists) { return null; }

            //파일을 읽어 Buffer에 저장, 한글문장일경우 Encoding을 지정해줘야한다.
            StreamReader sr = new StreamReader(mir_directory + @"\" + mir_fileName, Encoding.Default);
            return sr;
        }


        /// 
        /// ReadToEnd() - 버퍼에 있는 모든 텍스트를 한번에 가져온다.
        /// 
        /// 
        public void MirReadToEnd(StreamReader sr)
        {
            if (sr != null)
            {
                label1.Text = sr.ReadToEnd();
            }
        }


        /// 
        /// ReadLie() - 버퍼에 있는 텍스트를 한줄씩 가져온다.
        /// 
        public void MirReadLine(StreamReader sr)
        {
            if (sr != null)
            {
                // Peek() - 버퍼에 있는 다음문자를 int형식으로 복사하여 가져온다.(없을경우 -1을 리턴한다.)
                while (sr.Peek() > -1)
                {
                    label2.Text = label2.Text + "   " + sr.ReadLine();
                }
            }
        }

        
    }
}

- test.txt 내용 -

가나다라마바

1234567890

123456789

12345678

1234567

123456

12345

1234

123

12

 

- 출력 -

 

 

파일을 읽을때 몇가지 주의할점이

첫번째 File을 읽기전 우선적으로  해당 디렉토리가 있는지 그리고 해당 디렉토리에 파일이 있는지 확인을 해주는게 좋습니다.

두번째 Close 처리입니다.

Close처리를 제대로 해주지 않을경우 해당파일을 계속 사용하게 되는데 가끔 프로그램 종료후에도 파일은 계속 잡고 있어서 재부팅을 하지 않는한 해당 파일을 사용할수 없게 됩니다. (프로그램 재실행시 에러가 나버립니다.)

 

 


Tip. openFileDialog를 사용하면 파일경로와 파일명을 더욱 쉽게 구할수 있습니다.


※ 관련글


+ Recent posts