C# 파일처리
본문 바로가기
  • 게임 개발자가 되고싶은 구구
게임 개발 공부/C#

C# 파일처리

by gugu99 2021. 12. 25.
반응형

안녕하세요!

 

게임개발자가 되기위해 공부하고있는 구구입니다.

오늘은 C#의 파일처리에 대해 알아보도록 하겠습니다.


  • 스트림(Stream)

- 파일, 네트워크 등에서 사용

- File & Directory 클래스

- File 클래스는 static속성

 

  • Path를 만드는 법

string path = "";

path = Directory.GetCurrentDirectory();
path += "\\a.txt";

 

우선 path를 만들어주고 GetCurrentDirectory();를 이용해서 현재 작업하는 곳의 주소를 불러옵니다.

거기에 \\a.txt라는 말을 추가해줍니다.(이렇게 되면 실제로는 \a.txt 만 추가됨)

 

  • System.IO

- 파일과 데이터 스트림에 읽고 쓸 수 있게 하는 형식

- 기본 파일과 디렉터리 지원을 제공하는 형식

https://docs.microsoft.com/ko-kr/dotnet/api/system.io?view=net-6.0 

 

System.IO 네임스페이스

파일과 데이터 스트림에 대한 읽기 및 쓰기를 허용하는 형식과 기본 파일 및 디렉터리 지원을 제공하는 형식이 포함되어 있습니다. Contains types that allow reading and writing to files and data streams, and type

docs.microsoft.com

 

  • 바이트 입출력

- FileStream, BitConverter

- 데이터 형식을 byte배열로 변환(BitConverter)

- 사용빈도 낮음

 

  • 텍스트 입출력

- StreamWriter, StreamReader

 

 

 

 

 

 

 

 

 

 

C#-Stream-File-Directory-path-System.IO-FileStream-BitConverter-StreamWriter-StreamReader

해당 경로에 파일이 존재하는지 확인하고 존재하지 않는다면 파일을 만들고 존재한다면 해당 파일이 만들어진 시기를 출력하는 코딩입니다.

 

C#-Stream-File-Directory-path-System.IO-FileStream-BitConverter-StreamWriter-StreamReader


C#-Stream-File-Directory-path-System.IO-FileStream-BitConverter-StreamWriter-StreamReader
C#-Stream-File-Directory-path-System.IO-FileStream-BitConverter-StreamWriter-StreamReader

숫자 값들을 받아서 Stream 클래스를 이용해서 2진수로 바꾸고 다시 그 2진수를 우리가 원하는 자료형으로 출력합니다.

 

Stream outStream = new FileStream(fileName, FileMode.Create);

 

위 코딩에서 FileMode는 enum형입니다. 해당 파일이름(fileName)에 해당하는 모드(FileMode.Create), 즉 여기서는 생성을 합니다.

 

byte[] wBytes = BitConverter.GetBytes(lValue);

 

BitConveter 클래스의 GetBytes 함수는 괄호안의 값을 byte 배열로 변환합니다.

즉, BitConverter.GetBytes(바꾸고자하는 값); = 바꾸고자 하는값을 byte형태로 변경

 

{0:X2} 의 경우는 해당 문자열이 16진수로 2자리씩 끊어서 출력한다는 것을 의미합니다.

 

outStream.Write(wBytes, 0, wBytes.Length);

 

outstream에 wBytes를 0번째부터 wBytes의 길이만큼 쓴다는 뜻입니다.(즉, 저장)

 

outStream.Close(); -> 항상 Create를 했다면 마지막에 Close로 닫아줘야합니다.


C#-Stream-File-Directory-path-System.IO-FileStream-BitConverter-StreamWriter-StreamReader
C#-Stream-File-Directory-path-System.IO-FileStream-BitConverter-StreamWriter-StreamReader

StreamWriter sw = new StreamWriter(fsWrite); 

 

StreamWriter는 텍스트의 입출력을 받기위해 자주 사용합니다.

StreamWriter로 만든 인스턴스는 위의 코딩처럼 sw.Write("저장하고자 하는 문자열"); 과 같은 식으로 저장가능합니다.

 

sr.EndOfStream 은 해당 sr이라는 텍스트가 끝이면 false를 끝이 아니면 true를 반환합니다.

 

텍스트를 읽을때는 ReadLine을 사용해서 읽습니다.(sr.ReadLine())

 

  • StreamReader클래스의 인스턴스를 sr이라 할때

 

sr.BaseStream.Length = sr이 읽어들인 텍스트의 길이

sr.EndOfStream = sr이라는 텍스트가 끝이면 false를 끝이 아니면 true를 반환

sr.ReadLine() = 해당 문자열을 반환

 

 

 

 




  • 사용자 자료 입출력

- [Serializable] : 객체 직렬화(객체를 내가원하는 구조체나 자료형을 저장할 수 있는 형태로 만드는 것)

- BinaryFormatter, Serialize, Deserialize

- 사용빈도 높음

 

 

C#-Stream-File-System.IO-BinaryFormatter-Serialize-Deserialize-Serializable-객체 직렬화
C#-Stream-File-System.IO-BinaryFormatter-Serialize-Deserialize-Serializable-객체 직렬화

미리 struct형태로 정해놓은 Player는 [Serializable]의 형식입니다.

메인함수에서 2개의 player에 값을 넣었습니다.

fsw라는 객체를 만들고(실제 파일명은 savePlayer.txt) bf라는 BinaryFomatter로 만든 객체를 이용해서

br.Serialize(FileStream객체, [Serializable]형식의 struct);

와 같은 방식으로 fsw에 [Serializable]의 형식으로 저장된 player값을 씁니다.

반대로 bf2.Deserialize(fsR); 는fsw에 [Serializable]의 형식으로 저장된 player값을 읽는것입니다.

다만 이때 Deserialize를 이용해서 읽을경우 object형이 처음에 반환됩니다.

따라서 이를 Player[]형으로 캐스트 해줘야 readPlayer에 저장할 수 있습니다.(readPlayer가 Player[]형이기 때문)

 

정리하자면

BinaryFormatter의 클래스로 객체생성을 하게되면 미리 설정해둔 [Serializable]의 형식을 따르는 Struct의 값을 Serialize를 이용해서 저장할 수도 있고 Deserialize를 통해서 읽을 수 도 있습니다.

 

C#-Stream-File-System.IO-BinaryFormatter-Serialize-Deserialize-Serializable-객체 직렬화


C#-Stream-File-System.IO-BinaryFormatter-Serialize-Deserialize-Serializable-객체 직렬화
C#-Stream-File-System.IO-BinaryFormatter-Serialize-Deserialize-Serializable-객체 직렬화

일반화 List일경우의 읽기 쓰기입니다.

 

C#-Stream-File-System.IO-BinaryFormatter-Serialize-Deserialize-Serializable-객체 직렬화

 

 

 

  • 이진 입출력

- BinaryWriter, BinaryReader

- 모든 기본 데이터 형식(int, long ····)에 읽고 쓰기 오버로딩

 

C#-Stream-File-System.IO-using-클래스간소화-BinaryWriter-BinaryReader-이진입출력
C#-Stream-File-System.IO-using-클래스간소화-BinaryWriter-BinaryReader-이진입출력
C#-Stream-File-System.IO-using-클래스간소화-BinaryWriter-BinaryReader-이진입출력

지금까지는 Create를 하면 무조건 마지막에 Close를 써서 닫아줬지만 using을 사용하게 되면 자동으로 Close 해주는 기능이 있기때문에 보통 using을 이용해서 파일읽기를 자주 합니다.

 

BinaryWriter bw = new BinaryWriter(new FileStream(fileName2, FileMode.Create))

=

FileStream fs = new FileStream(fileName, FileMode.Create);
BinaryWriter bw = new BinaryWriter(fs);

 

두문장을 한문장으로 줄일 수 있습니다.

ReadInt32, ReadString 과같은 것은 말 그대로 Int형, stirng형으로 읽으란 뜻입니다.

 

C#-Stream-File-System.IO-using-클래스간소화-BinaryWriter-BinaryReader-이진입출력




  • CSV데이터 활용

- 게임 데이터 협업

- String.Split 활용

 

Spring데이터.Split('특정문자') = 특정 문자를 기준으로 구분 

 

C#-Stream-File-System.IO-CSV데이터-CSV-엑셀-split-콤마분리-콤마-,

다음과 같이 프로젝트 bin폴더 Debug폴더안에 test라는 이름의 엑셀파일이 있고 그 엑셀파일은 위와 같습니다.

이럴때 해당 엑셀파일을 불러읽는 방법에 대해 알아보겠습니다.

 

C#-Stream-File-System.IO-CSV데이터-CSV-엑셀-split-콤마분리-콤마-,
C#-Stream-File-System.IO-CSV데이터-CSV-엑셀-split-콤마분리-콤마-,

우선 엑셀파일명은 test이기 때문에 fileName을 test.csv로 설정합니다.

StreamReader sr = new StreamReader(new FileStream(fileName, FileMode.Open))

로 StreamReader를 사용하는데(텍스트 읽을때 사용) File Stream의 인스턴스를 파라미터로 받습니다.

그 다음 sr을 한줄씩 읽기 위해 index를 사용합니다.

우선 false == sr.EndOfStream의 조건으로 문장의 끝마다(현재 엑셀은 5줄인데 첫번째 줄은 목차) 그 값을 readstr에 저장합니다. 첫줄은 데이터를 읽을 필요는 없기에 버리고(줄을 index로 확인) index가 1일때 부터 실질적인 데이터 값이 들어오기 떄문에 1일때부터 값을 받아옵니다.

Split을 이용해서 ,를 기준으로(엑셀은 칸으로 구분되어있지만 사실 메모장에서 보면 데이터 구분을 ,로 함) 각각의 줄에서 데이터들을 분리해서 string 배열에 넣습니다. 총 5열이기 때문에 index가 0인값부터 하나하나 넣고 그다음 그것을 전부 합쳐서(Stage) list안에 넣습니다.

 

이후 이를 foreach문을 이용해서 출력합니다.

 

만약 이해가 어려우시다면 아래에도 간단하게 Split으로 string을 구분하여 각각 출력하는 간단한 코드를 넣었습니다.

 

C#-Stream-File-System.IO-CSV데이터-CSV-엑셀-split-콤마분리-콤마-,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

오늘은 여기까지 하도록 하겠습니다.

반응형

'게임 개발 공부 > C#' 카테고리의 다른 글

C# 쓰레드 2  (0) 2021.12.27
C# 쓰레드 1  (0) 2021.12.26
C# LINQ  (0) 2021.12.24
C# 람다식  (0) 2021.12.23
C# 델리게이트&이벤트  (0) 2021.12.22

댓글