C# - File처리

양규빈·2024년 2월 4일
0

C# 공부

목록 보기
27/30

File처리란?

파일처리는 파일의 형태로 데이터를 저장하고 읽는 것을 의미한다.
닷넷프레임워크의 System.IO 네임스페이스를 사용하여 수행할 수 있는데,

주요 기능으로는
1. 파일 및 디렉터리를 생성
2. 파일 및 디렉터리를 수정
3. 파일 및 디렉터리를 삭제
4. 파일에서 데이터를 읽기
5. 파일에서 데이터를 쓰기

등이 있다.

여기서 파일이란 프로그램 바깥에 지정된 텍스트 파일 또는 이진 파일 등을 의미한다.
일반적으로 프로그램이 실행 중일 때 사용되는 데이터가 메모리에서 관리되어 프로그램 종료 시에 사라지는 반면,
파일 시스템을 이용하면 외부 파일을 통해서 영구적으로 저장하고 다시 읽어들일 수 있다는 장점이 있다.

이러한 파일 시스템은 주로 사용자 데이터베이스, 로그 파일, 설정 파일 등을 관리하는 데 쓰인다.

코드 구현

Directory 생성

파일을 읽기 위한 주소를 작성하는 Path 코드의 작성법은 두 가지가 있다.

  • @“c:\주소”
  • “c\주소”

양쪽 모두 주소로써 활용할 수 있다.

CreateDirectory 코드를 통해서 디렉터리를 생성할 수 있다.

위 사진을 보면, 폴더가 생성되었음을 확인할 수 있다.

File 생성과 주소 얻기

위의 코드는 dirPath 경로가 실제로 존재하는지 확인한 후, 존재할 경우 파일을 생성하는 과정이다.

string[] fileNums 배열에는 생성할 파일의 이름이 저장되어 있다.

foreach루프 내에서는 path 변수를 생성하여 dir.FullName과 각 파일 이름을 결합한다.
이렇게 하면 파일이 생성될 경로가 형식화된다.

File.Create(path) 메서드를 사용하여 해당 경로에 파일을 생성합니다. 파일을 생성한 후에는 file.Close()를 호출하여 파일을 명시적으로 닫습니다.
단. 이전에 파일 생성을 using 문으로 감싸면 파일 스트림이 자동으로 닫힙니다.

이때,
string path = $"{dir.FullName}\\{item}";
string path2 = Path.Combine(dirPath, item );
두 코드는 동일한 결과를 보인다. 즉 Path의 Combine 메서드를 이용하면, 더 편리하게 주소와 파일 이름을 결합할 수 있다.

파일 생성에 성공했음을 확인할 수 있다.

루트 폴더에 바로 저장된 파일이 아닌 이상, 파일의 주소를 가져와 참조해야 한다.

Directory.GetFiles 메서드는 특정 디렉터리에서 파일 목록을 가져오는 데 사용되는 메서드이다. 이 메서드는 지정된 디렉터리에서 파일의 경로를 문자열 배열로 반환한다.

string[] GetFiles(string path, string searchPattern);
path: 파일을 검색할 디렉토리 경로.
searchPattern: 파일 이름에 대한 검색 패턴을 지정한다. 이는 와일드카드 문자(* 또는 ?)를 사용하여 파일 이름을 일치시킬 수 있다.

파일 쓰기

using 문을 사용하여 FileStream을 생성하고, FileMode.Create를 통해 파일이 없을 경우 새로운 파일을 생성.

writeStream2 변수는 FileStream 객체를 나타내며, 파일에 데이터를 쓰는 데 사용한다.

BitConverter.GetBytes(num)는 정수 num을 바이트 배열로 변환한다.

writeStream2.Write(bytes2, 0, bytes2.Length)은 바이트 배열을 파일에 쓰고, bytes2 배열의 내용을 파일의 시작 위치(오프셋 0)부터 bytes2.Length만큼 쓴다.

생성된 파일을 확인 가능하다.

쓴 데이터를 읽는 과정은 위와 같다.

BinaryWriter

BinaryWriter는 주로 이진 데이터를 처리하는 데 사용된다.
이진 파일에 원시 데이터 형식 (정수, 부동 소수점 등)을 직렬화하여 쓰거나, 특정 바이트 배열을 파일에 쓸 때 사용한다.

BinaryWriter는 문자열을 직접 바이트로 변환하기 때문에 인코딩을 사용하지 않는다.

BinaryWriter는 개행 문자를 자동으로 처리하지 않기 때문에 수동으로 개행해주어야 한다.

BinaryWriter – Reader를 이용하면, 데이터를 변환하는 컨버트 과정이 생략된다.

Stream

텍스트 파일을 생성하는 방법은 다양한 가짓수가 존재한다.
그중,
StreamWriter 클래스는 텍스트를 파일에 쓰는 데 사용되는 .NET Framework의 클래스이다.
이 클래스는 System.IO 네임스페이스에 속해 있으며 StreamWriter를 사용하면 텍스트 파일을 만들거나 기존 파일에 텍스트를 추가하거나, 텍스트 파일을 덮어쓸 수 있다.

스트림의 생성자 함수는 여러 가지가 존재하며, 각 생성자가 요구하는 파라미터에 맞게 데이터를 넘기면, StreamWriter를 여러 방식으로 구현할 수 있는 것이다.

루트 폴더에서 텍스트 파일을 생성하고 저장한 것을 확인할 수 있다.

StreamReader가 3.txt에 접근하고EndOfStream을 조건으로 검사하며, 마지막 인덱스에 도착할 때까지 반복하며 데이터를 출력한다.

복합 자료형과 파일 입출력

Serializable == 직렬화.
객체의 상태를 저장하거나 전송하기 위해 객체바이트 스트림으로 변환하는 프로세스
직렬화를 통해 객체는 바이트 스트림으로 변환되어 파일에 저장하거나 네트워크를 통해 전송할 수 있다.

이후에는 바이트 스트림을 역직렬화(Deserialization)하여 원래의 객체로 복원할 수 있다.

Serializable 특성은 클래스나 구조체가 직렬화될 수 있음을 나타내기 위해 사용한다.

Serializable 특성을 적용하면 직렬화 프로세스가 일부 또는 모든 멤버(필드, 속성 등)를 직렬화할 수 있다.

기본적으로 C#에서는 클래스의 모든 공용(public) 및 비공용(private) 필드가 직렬화된다. 하지만 NonSerialized 특성을 사용하여 특정 필드를 직렬화에서 제외할 수도 있다.

데이터를 저장할 때 직렬화를 했다면,
불러올 때는 역직렬화를 해야 한다.

이렇게 직렬화를 선언한 데이터는

BinaryFormatter 또는 JsonSerializer의 Serialize 메서드를 사용하여 객체 직렬화를 시켜줄 수 있다.

반대로 역직렬화는 Deserialize 코드를 사용한다.

위와 같은 코드로, 데이터를 Create하여 저장하고, Open하여 읽어들일 수 있다.
이때, List<Item>은 오브젝트이며, 오브젝트는 데이터 타입을 명시화 해주어야 한다.

최종적으로 이러한 결과를 콘솔창으로 확인할 수 있다.
저장된 데이터를 출력한 모습이다.

profile
훌륭한 개발자를 꿈꾸는 중입니다

0개의 댓글