공부/C#

파일 입출력, 유니티 파일 입출력, Using Streams, MemoryStream, Path

월러비 2025. 9. 9. 18:51

Stream Architecture

  • 파일은 보통 ‘단방향’으로 읽고 쓰고를 진행한다.
  • 대표적 파일 입출력
    • 콘솔 입출력
    • IDE 입출
  • Stream adapters, Decorator streams, Backing store streams는 전부 클래스 이름이다.
    • Stream adapters : 텍스트 데이터, 바이너리 데이터, Json 데이터 등을 읽고 쓰는 작업을 담당한다.
    • Decorator streams : 데이터를 감싸는 기능
      • GZipStream : 압축 기능이 모여져있는 클래스다.
        • 압축을 다루는 스트림에 입력과 출력을 하는것과 같다.
    • Backing store streams : 특정 하드웨어와 매칭하고, 데이터를 주고받는 기능
      • 주로 FileStreamMemoryStream을 사용한다.
      • FileStream : 파일 읽고 쓰기 등을 가능하게 하는 기능이 모여져있는 클래스다.
        • 파일 읽고 쓰기는 데이터 ‘비트’들을 주고 받는것이다.
  • 이 이외에도 여러 작업을 담당하는 기능들이 있다.
  • 순차적으로 데이터를 읽고 씀
    • stream처럼 단방향으로 데이터가 흐르는것을 생각하면 된다.
  • 세부 구현 노출 X, 표준 메소드 세트로 읽기, 쓰기, 위치 조정
  • 한 바이트 또는 임의의 바이트 블럭 단위로 데이터를 순서대로 읽고 씀

유니티 파일 입출력

  • Json 라이브러리
  • CSV 라이브러리

Using Streams

  • 모든 스트림 클래스들의 최상위 클래스다.
  • Stream s : 추상 클래스
  • using 구문 : 예외처리와 관계가 있다.
    • 에외가 나거나 말거나 FileStream의 dispose 메서드를 호출한다.
    • 예외가 나서 중지된다면 파일 열어놓은것을 처리해야한다.
      • dispose 메서드에 그러한 작업을 처리하는 구문이 담겨져있다.
  • FileSteam(파일 경로 - 상대 경로, 파일 모드)
    • 상대 경로는 항상 기준이 필요하다.
      • 일반적으로 어플리케이션의 기준은 실행 파일이 기준이 된다.
      • C++때는 실행파일 기본경로와 다른 기본경로가 달랐지만, C#은 기본 경로가 같아서 신경쓰지 않아도 된다.
    • 기본동작이 바이너리 데이터를 읽고 쓰는것으로 되어있다.
      • 따라서, 기본이 ‘바이트 단위’로 읽고 쓰기를 진행한다.
  • Write(바이트 배열, 시작 인덱스, 배열 요소 갯수) : 경로의 파일에 처음부터 요소 갯수만큼 쓰겠다는 것이다.
  • Read(바이트 배열, 카운트, 요소 갯수) : 바이트 배열을 카운트부터 요소 갯수만큼 읽어오는 것이다.
    • 즉, 실재로 쓰여진 요소를 읽어오는것이다.
    • 왜 마지막의 출력은 0인 것인가? ; 하나씩 읽어 5를 반환하니 현재 위치가 마지막 요소 위치로 저장되었기에 0의 자리는 마지막 요소의 위치가 되는 것이다.
  • WriteByte : 파일에 바이트형 정수를 작성하는 함수
  • FileMode가 Create이니 실재로 파일이 생성된다.
    • 확장자는 txt이지만 FileStream은 ‘바이너리 데이터’로 읽고 쓰기가 진행되기에 저장되는 데이터는 바이너리 파일로 저장된다.
  • byte[] data = new byte[1000] : 1000개의 버퍼를 생성하는 것이다.

MemoryStream

FileStream sourceStream;

var ms = new MemoryStream();
sourceStream.CopyTo (ms);
  • 네트워크가 제일 느리다 < 보조기억장치 < cpu 단의 메모리
  • FileStream은 보조기억장치와 속도가 맞춰진다.
    • 즉, 느리다는 것이다.
    • 지금은 네트워크도 빨라져서 속도 차이가 많이 안난다.
  • 파일에서 스트리밍하는게 아니라 파일을 올리고 메모리에서 스트리밍하는게 더 속도가 빠르다.
    • 세부적인 조작을 메모리 스트림에서 하는것이다.

Path

  • 파일경로나 디렉토리 경로를 만드는데 도움이 되는 기능이 모여진 클래스다.
string dir  = @"c:\\mydir";    // or /mydir
string file = "myfile.txt";
string path = @"c:\\mydir\\myfile.txt";    // or /mydir/myfile.txt

Directory.SetCurrentDirectory (@"k:\\demo");    // or /demo
  • SetCurrentDirectory : 현재 경로 설정 함수다.
Directory.GetCurrentDirectory()	// k:\\demo\\ or /demo
Path.IsPathRooted (file)	// False
Path.IsPathRooted (path)	// True
Path.GetPathRoot (path)	// c:\\ or /
Path.GetDirectoryName (path)	// c:\\mydir or /mydir
Path.GetFileName (path)	// myfile.txt
Path.GetFullPath (file)	// k:\\demo\\myfile.txt or /demo/myfile.txt
Path.Combine (dir, file)	// c:\\mydir\\myfile.txt or /mydir/myfile.txt
  • GetCurrentDirectory : 현재 경로 반환
  • IsPathRooted : 최상위 경로인지 확인

'공부 > C#' 카테고리의 다른 글

LINQ 연산자  (0) 2025.09.09
LINQ 하위 쿼리, let 키워드  (0) 2025.09.09
LINQ 질의식, LINQ 지연 실행  (0) 2025.09.09
쿼리 연산자 체이닝, 지연 실행의 장점  (0) 2025.09.09
LINQ, 쿼리 연산자, 람다 식  (0) 2025.09.09