프로그래밍/(도서)C#코딩의기술-실전

[C#] 코딩의기술(실전편) - 1.6 강제 종료 처리

Victory_HA 2022. 3. 31. 22:25

Flush()와 Close()

  • Flush() : 이 스트림의 버퍼를 지우고 버퍼링된 모든 데이터가 파일에 쓰여지도록 합니다.
    • 파일에 데이터가 기록될 예정이지만, 아직 기록되지 않은 데이터를 저장합니다.
  • Close() : Flush()의 기능 + '파일 닫기' 기능을 추가합니다.

사용예제

using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;

class Solution
{
    static void Main(string[] args)
    {
        String fileName= "test.txt";

        var writer = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), fileName));
        writer.WriteLine("hello world.");
        //writer.Flush();    //System.IO.IOException 오류 발생
        writer.Close();
        var reader = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), fileName));
        Console.WriteLine(reader.ReadToEnd());
    }
}

실행결과

  • 예제에서 writer.Flush()를 호출하는 경우 System.IO.IOException 오류 발생합니다.
  • 파일을 Open 이후 Close하지 않고, 다시 파일을 Open하기 때문에 오류가 발생합니다.
  • Close()호출 시 오류 해결됩니다.

Using문과 try-finally구문

  • Using문이 끝날 때 객체(writer, reader)가 가지는 Dispose 메서드를 자동으로 호출하여 파일을 Close합니다.
    • 종료 처리를 호출합니다.
  • Using블록 내에서 어떤 예외적인 상황이 발생해도 Dispose가 호출되는 것을 보장합니다
  • Using문을 사용하는 것은 try블록 내에 객체를 두고 finally블록에서 Dispose를 호출 하는 것과 동일합니다.

Using문 사용예제

String fileName= "Using.txt";

using (var writer = new StreamWriter(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), fileName)))
{
    writer.WriteLine("hello world.");
}    

using (var reader = new StreamReader(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), fileName)))
{
    Console.WriteLine(reader.ReadToEnd());
}

실행결과

try-finally구문 사용예제

string fileName = "tryfinally.txt";
var filepath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), fileName);

var writer = new StreamWriter(filepath);

//System.IO.IOException 발생
//var reader = new StreamReader(filepath);  

try
{
    writer.WriteLine("hello world 1.");
    writer.WriteLine("hello world 2.");

}
finally
{
    writer.Dispose();
}

var reader = new StreamReader(filepath);

Console.WriteLine($"{reader.ReadToEnd()}");

실행결과