C# FileStream: 파일 읽고 쓰기의 핵심

C# FileStream은 파일을 읽고 쓰는 작업을 수행하는 데 사용되는 클래스입니다. 이 클래스는 파일에 대한 스트림을 제공하여 동기 및 비동기적으로 데이터를 읽고 쓸 수 있습니다. FileStream을 사용하면 파일에서 데이터를 읽어들이거나 파일로 데이터를 쓸 수 있으며, 이를 통해 파일 기반의 입출력 작업을 수행할 수 있습니다. 또한 FileStream을 사용하여 파일에서 데이터를 읽어오거나 파일로 데이터를 쓸 때 바이트 수준의 접근이 가능하므로, 다양한 형식의 데이터를 처리할 수 있습니다. FileStream은 파일 처리 작업을 위한 강력한 도구이며, C#에서 파일 입출력 작업을 수행할 때 매우 유용하게 사용됩니다.

C# FileStream

FileStream은 파일에 대한 스트림을 제공하여 동기식 및 비동기식 읽기 및 쓰기 작업을 지원합니다. 스트림은 소스에서 대상으로의 데이터 흐름입니다. 소스 또는 대상은 디스크, 메모리, 소켓 또는 다른 프로그램일 수 있습니다.

FileStream으로 텍스트 쓰기

다음 예제에서는 FileStream을 사용하여 텍스트 데이터를 파일에 씁니다.

using System.Text;

var fileName = @"D:\Temp\words.txt";

using FileStream fs = File.OpenWrite(fileName);

var data = "HaroStudio Test Data";
byte[] bytes = Encoding.UTF8.GetBytes(data);

fs.Write(bytes, 0, bytes.Length);

이 예제는 몇 개의 단어를 텍스트 파일에 씁니다.

using FileStream fs = File.OpenWrite(fileName);

File.OpenWrite 메서드는 쓰기 모드로 FileStream을 엽니다.

var data = "HaroStudio Test Data";
byte[] bytes = Encoding.UTF8.GetBytes(data);

우리는 바이트로 작업할 텍스트 데이터를 가지고 있습니다. Encoding.UTF8.GetBytes를 사용하여 바이트로 변환합니다.

fs.Write(bytes, 0, bytes.Length);

Write를 사용하여 바이트가 FileStream에 씌워집니다.

StreamWriter를 사용하여 텍스트 쓰기

다음 예제에서는 FileStream을 StreamWriter와 함께 사용합니다.

var fileName = @"D:\Temp\words.txt";

using FileStream fs = File.Create(fileName);
using var sr = new StreamWriter(fs);

sr.WriteLine("HaroStudio Write Test");

Console.WriteLine("done");

이 예제는 텍스트 데이터를 파일에 씁니다. 편의를 위해 특정 인코딩으로 문자를 스트림에 작성하는 StreamWriter를 사용합니다.

using FileStream fs = File.Create(fileName);
using var sr = new StreamWriter(fs);

StreamWriter가 생성됩니다. FileStream를 매개변수로 사용합니다.

sr.WriteLine("HaroStudio Write Test");

StreamWriter의 WriteLine으로 한 줄의 텍스트가 FileStream에 씌워집니다.

FileStream으로 텍스트 읽기

다음 예제에서는 FileStream을 사용하여 텍스트 파일에서 데이터를 읽습니다.

using System.Text;

var fileName = @"D:\Temp\words.txt";

using FileStream fs = File.OpenRead(fileName);

byte[] buf = new byte[1024];
int c;

while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
    Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
}

이 예제는 텍스트 파일을 읽고 내용을 출력합니다. 바이트로 데이터를 읽고 UTF8 인코딩을 사용하여 문자열로 변환한 후, 문자열을 콘솔에 씁니다.

using FileStream fs = File.OpenRead(fileName);

File.OpenRead로 파일을 읽습니다. 이 메서드는 FileStream을 반환합니다.

byte[] buf = new byte[1024];

buf는 파일에서 데이터를 읽는 데 사용되는 바이트 배열입니다.

while ((c = fs.Read(buf, 0, buf.Length)) > 0)
{
    Console.WriteLine(Encoding.UTF8.GetString(buf, 0, c));
}

FileStream의 Read 메서드는 스트림에서 바이트 블록을 읽고 데이터를 지정된 버퍼에 씁니다. 첫 번째 인수는 읽은 바이트가 배치될 배열 내의 바이트 오프셋입니다. 두 번째는 읽을 최대 바이트 수입니다. Encoding.UTF8.GetString은 지정된 바이트 배열의 모든 바이트를 문자열로 디코딩합니다.

StreamReader를 사용하여 텍스트 읽기

다음 예제에서는 FileStream을 StreamReader와 함께 사용합니다.

var fileName = @"D:\Temp\words.txt";

using FileStream fs = File.OpenRead(fileName);
using var sr = new StreamReader(fs);

string line;

while ((line = sr.ReadLine()) != null)
{
    Console.WriteLine(line);
}

이 예제에서는 텍스트 파일을 읽습니다. StreamReader를 사용할 때는 바이트를 문자로 변환할 필요가 없습니다.

using FileStream fs = File.OpenRead(fileName);
using var sr = new StreamReader(fs);

FileStream를 StreamReader에 전달합니다. 인코딩을 명시적으로 지정하지 않으면 기본적으로 UTF8이 사용됩니다.

string line;

while ((line = sr.ReadLine()) != null)
{
    Console.WriteLine(line);
}

StreamReader의 ReadLine 메서드를 사용하여 데이터를 읽습니다. 이 메서드는 입력 스트림의 다음 줄을 반환하거나 입력 스트림의 끝에 도달하면 null을 반환합니다.

FileStream 파일 복사

CopyTo 메서드는 현재 스트림에서 바이트를 읽어 다른 스트림에 씁니다.

var fileName = "words.txt";
using var fs = new FileStream(fileName, FileMode.Open);

var fileName2 = "words_copy.txt";
using var fs2 = new FileStream(fileName2, FileMode.OpenOrCreate);

fs.CopyTo(fs2);

Console.WriteLine("파일이 복사되었습니다.");

이 예제는 CopyTo 메서드로 텍스트 파일을 복사합니다.

C# FileStream 이미지 다운로드

다음 예제에서는 작은 이미지 파일을 다운로드합니다.

using var httpClient = new HttpClient();
var url = "https://i0.wp.com/harostudio.co.kr/wp-content/uploads/2023/08/haro.png?fit=350%2C70&ssl=1";
byte[] imageBytes = await httpClient.GetByteArrayAsync(url);

using var fs = new FileStream("haro.png", FileMode.Create);
fs.Write(imageBytes, 0, imageBytes.Length);

Console.WriteLine("이미지가 다운로드되었습니다.");

이 예제에서는 HttpClient를 사용하여 작은 이미지 파일을 다운로드합니다. 이미지는 바이트 배열로 검색됩니다. 그런 다음 바이트는 FileStream에 씌워집니다.

using var fs = new FileStream("haro.png", FileMode.Create);
fs.Write(imageBytes, 0, imageBytes.Length);

새 파일을 작성합니다. 바이트는 Write 메서드를 사용하여 새로 생성된 파일에 씌워집니다.

C# FileStream 이미지 읽기

다음 예제에서는 이미지 파일을 읽습니다. 파일을 16진수 데이터로 출력합니다.

var fileName = @"D:\Temp\haro.png";

using var fs = new FileStream(fileName, FileMode.Open);

int c;
int i = 0;

while ((c = fs.ReadByte()) != -1)
{

    Console.Write("{0:X2} ", c);
    i++;

    if (i % 10 == 0)
    {
        Console.WriteLine();
    }
}

이 예제에서는 작은 이미지를 16진수 표기법으로 출력합니다.

while ((c = fs.ReadByte()) != -1)

ReadByte 메서드는 파일에서 바이트를 읽고 읽기 위치를 한 바이트 앞으로 이동합니다. 바이트를 Int32로 캐스트하여 반환하거나 스트림의 끝에 도달하면 -1을 반환합니다. 매우 작은 이미지를 처리하기 때문에 한 바이트씩 읽는 것이 괜찮습니다.

Console.Write("{0:X2} ", c);

{0:X2}는 바이트를 16진수로 출력합니다.

if (i % 10 == 0)
{
    Console.WriteLine();
}

10개의 열 후에 새 줄 문자를 씁니다.

FileStream 스트리밍

스트리밍은 전체 파일이 완전히 전송되기 전에 수신 컴퓨터에서 데이터를 연속적으로 처리하는 방법입니다.

using var httpClient = new HttpClient();

var url = "https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.2/images/NetBSD-9.2-amd64-install.img.gz";

var fname = Path.GetFileName(url);

var resp = await httpClient.GetAsync(url,
    HttpCompletionOption.ResponseHeadersRead);
resp.EnsureSuccessStatusCode();

using Stream ms = await resp.Content.ReadAsStreamAsync();

using FileStream fs = File.Create(fname);
await ms.CopyToAsync(fs);

Console.WriteLine("파일이 다운로드되었습니다.");

NetBSD USB 이미지를 스트리밍 작업을 사용하여 다운로드합니다.

using var httpClient = new HttpClient();

HttpClient를 사용하여 HTTP 요청을 생성합니다.

var resp = await httpClient.GetAsync(url,
    HttpCompletionOption.ResponseHeadersRead);

HttpCompletionOption.ResponseHeadersRead 옵션을 사용하면 비동기 작업이 응답을 사용할 수 있고 헤더가 읽혀지면 바로 완료됩니다. 콘텐츠는 아직 읽혀지지 않습니다. 이 메서드는 헤더를 읽은 후에 제어를 반환합니다.

using Stream ms = await resp.Content.ReadAsStreamAsync();

ReadAsStreamAsync 메서드는 HTTP 콘텐츠를 직렬화하고 콘텐츠를 나타내는 스트림을 반환합니다. 이것은 비동기 작업입니다.

using FileStream fs = File.Create(fname);

File.Create을 사용하여 파일 스트림을 생성합니다. 지정된 경로에 파일을 생성하거나 덮어씁니다.

await ms.CopyToAsync(fs);

데이터가 지속적으로 파일 스트림으로 복사됩니다.

요약

FileStream은 C#에서 파일 읽기 및 쓰기 작업을 위한 핵심 도구입니다. 이를 통해 프로그램은 파일로부터 데이터를 읽고 파일에 데이터를 쓸 수 있습니다. 비동기 작업을 사용하면 파일 처리 속도를 높일 수 있습니다. FileStream을 활용하여 파일 처리 작업을 보다 효율적으로 수행할 수 있습니다.

Leave a Comment