[C#] File, Directory, FileInfo, DirectoryInfo, Path

2013. 6. 9. 15:37Others/C# 일반

File, Directory, FileInfo, DirectoryInfo, Path

각각 File, Directory, Path를 표현하는 Class로써 File 또는 Directory, Path에 대한 작업을 지원해줍니다.

  • File: File들에 대한 생성, 삭제, 조회, 권한설정, 입출력에 필요한 다양한 Static Method를 제공합니다.
  • FileInfo: 특정 파일에 대해 표현하는 Instance로써 해당 파일의 생성, 삭제, 조회, 권한설정, 입출력에 필요한 다양한 Instance Method를 제공합니다.
  • Directory: Directory들에 대한 생성, 삭제, 조회, 권한설정, 입출력에 필요한 다양한 Static Method를 제공합니다.
  • DirectoryInfo: 특정 Directory에 대해 표현하는 Instance로써 해당 Directory의 생성, 삭제, 조회, 권한설정, 입출력에 필요한 다양한 Instance Method를 제공합니다.
  • Path: 경로를 표현하고 조작할 수 있는 Method, Property 들을 제공합니다.

Stream

Stream이란 일련의 Byte(Sequence of bytes)을 표현하는 추상 클래스로써 Seeking(탐색), Reading(읽기), Writing(쓰기)에 대한 가장 기본적인 기능을 제공합니다. (A generic view of a sequence of bytes)

Stream은 Byte Array를 다루는데 있어 가장 기본적인 기능을 추상화하고 있으며 스스로 인스턴스화 할 수 없습니다. BCL에서는 Stream이 위치한 곳에 따라 Stream을 상속한 FileStream, MemoryStream, NetworkStream, CryptoStream, Buffered Steam 외 여러 Class를 제공하고 있습니다.

  • FileStream: File에 대한 Stream을 제공
  • MemoryStream: Momory에 대한 Stream을 제공
  • NetworkSteram: Network에 대한 Stream을 제공
  • CryptoStream: Stream에 대한 암호화 지원
  • BufferedStream: Stream에 대한 버퍼 제공

FileStream, MemonryStream, NetworkStream은 Stream의 위치에 따라 구분된 Class이며 CryptoStream, BufferedStream은 Stream에 대한 암호화, 버퍼링 등 Stream을 확장지원해주는 Class입니다.

몇 가지만 대표적으로 설명해보면 FileStream은 파일에 위치한 Stream에 대한 입출력을 제공하며, 데이터를 쓰거나 읽을 경우 파일에 대한 즉시 입출력이 일어납니다. 또한 FileStream이 닫히기 전까지 해당 파일 자원을 독점합니다.

BufferedStream은 자체가 Stream에 대한 입출력을 제공하는 것이 아니라, Stream의 입출력에 대해 Buffer를 제공하여 성능을 향상시키는데 목적이 있습니다. 예를 들어 FileStream을 통해 파일을 10번 쓰거나 읽으면 HDD I/O가 10회가 발생하게 됩니다. 알다시피 HDD는 느린 자원 중 하나로써 I/O가 많이 발생 할수록 Application의 성능이 저하됩니다. 하지만, BufferedStream을 사용하면 Buffer에 데이터를 입출력하며 버퍼가 가득 차거나 필요한 경우 버퍼에 저장된 데이터를 HDD에 기록하게 함으로써 실제 I/O를 줄일 수 있게 합니다. MSDN에 의하면 128KB Buffer를 제공할 경우 FileStream의 성능이 10~20%가량 향상된다고 합니다.

//다음과 같이 일반 Stream을 BufferedStream에 넘거주어 Buffering기능을 제공할 수 있다.
FileStream fs = new FileStream("Data.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
BufferedStream bs = new BufferedStream(fs);

Readers and Writeres

Stream에서 문자정보를 읽고 쓰는 작업을 보다 쉽게, 확장된 기능을 제공하는 Class입니다. Stream이란 Byte로 원시데이터를 읽고, 쓰고, 조작하기 위한 목적으로 설계되었다면 Reader와 Writer 유형의 Class 들은 Encoding된 문자열을 Byte로부터 읽거나 Byte로 쓰는 작업을 지원하며, 이는 Stream이 할 수 있는 작업을 보다 쉽게 진행할 수 있게 확장하는 목적이 있습니다. 각 Reader, Writer Class들은 Stream과 관계하여 데이터를 입출력하며 Stream과 마찬가지로 다양한 Reader, Writer Class를 제공합니다.

  • TextReader, TextWriter: Reader, Writer Class에 대한 가장 기본적인 기능을 제공하는 추상클래스 입니다.
  • BinaryReader, BinaryWriter: Stream을 이진데이터로 읽거나 씁니다. (Binary: 2진수를 기반으로 표현되는 데이터)
  • StreamReader, StreamWriter: 특정 Encoding 된 문자 값으로 Stream을 읽거나 씁니다.
  • StringReader, StringWriter:

    StreamReader, StreamWriter는 Stream으로부터 데이터를 입출력하지만, StringReader, StringWirter는 좀더 분명하게 String으로부터 데이터를 읽고 씁니다. Stream이 아닌 String으로부터 데이터를 입출력한다는 의미를 좀더 설명하자면 StringReader, StringWriter는 MemoryStream 처럼 메모리에 존재하는 string, StringBeader,에서 데이터를 입출력 합니다.

    덧붙여서 왜 StringBuilder, String을 쓰는 것이 아니라 번거롭게 StringReader, StringWriter를 쓰는지 궁금할 수 있습니다. StringBuilder, String은 String 정보를 표현할 뿐이며 StringReader, StringWriter는 ReadLine, WriteLine, WriteAsync와 같은 Method를 통해 문자열의 입출력을 위한 기능을 확장시켜줍니다. 또한 TextWriter, TextReader를 상속하기에 다른 Reader, Writer Class와 일관된 처리를 할 수 있으며, TextWriter, TextReader를 사용하는 Class에 사용될 수 도 있습니다.

    솔직히 String, StringBuilder를 쓰는 것 대신에 StringWriter, StringReader를 이용함으로써 얻는 이득은 매우 근소할 수 있습니다. 이와 같은 예는 Stream을 통해 직접 Byte데이터를 입출력하는 것과 BinaryReader, BinaryWriter를 통해 데이터를 입출력하는 것 사이에 느낄 수 있는 근소한 차이 등이 있습니다.

Thread Safety

위의 Writer, Reader Class들은 기본적으로 Thread Safety하지 않습니다. 따라서 필요하다면 TextWriter.Syncronized를 이용하여 Thread Safety를 구현할 수 있습니다.

(Thread Safety: 여러 Thread가 하나의 자원에 참조할 경우에도 해당 기능이 의도했던 데로 정상적으로 동작하는지 여부를 말합니다. Thread Safety가 지켜지지 않는지 판단하는 것은 간단한 것은 아니지만 예를 들면 전역변수에 데이터를 공유한다고 할 경우, A Thread가 “ABCDEF”를 변수에 저장하는 작업을 진행한다고 가정할 경우, 이를 위해 A Thread는 “ABC”까지 기록한 상태에서 갑자기 다른 B Thread로 Context전환이 일어난 경우, 넘겨받은 B Thread는 “ABC”를 지워버릴 수도 있습니다. 그 후 A Thread로 Context 전환이 일어나 나머지 “DEF”를 전역변수에 기록했을 경우 “DEF”만 전역변수에 기록되는 것은 개발자가 의도하지 않은 경우이므로 Thread Safety하지 않다라고 할 수 있습니다.)

Reference