2013-02-02 3 views
19

FileStream이있는 StreamWriter을 사용하여 .NET 4.5의 기존 파일에 텍스트를 추가 할 때 흥미로운 점이 생겼습니다 (이전 프레임 워크는 사용하지 않았습니다). 나는 두 가지 방법을 시도했다. 하나는 효과가 있었고 하나는 그렇지 못했다. 나는 둘의 차이가 무엇인지 궁금 하네. 나는 그것이 응용 프로그램이 완전히 파일을 닫습니다 수 있도록하는 가장 좋은 방법이 있다는 개인적인 경험을 통해 발견했기 때문에StreamWriter 및 FileStream을 사용하여 txt 파일에 쓰기

두 방법은 상단

if (!File.Exists(filepath)) 
    using (File.Create(filepath)); 

나는 using 문에서 생성을에서 다음 코드를 포함 .

비 작동 방법 :이 방법 아무 것도

using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write)) 
    (new StreamWriter(f)).WriteLine("somestring"); 

이 파일에 추가되고 끝납니다.

작업 방법 :

나는 매우를 검색하고, 정보를 아무것도 발견하지 않았습니다 모르고, 인터넷 검색을 조금 해봤
using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write)) 
    using (StreamWriter s = new StreamWriter(f)) 
     s.WriteLine("somestring"); 

. 그래서 익명의 사람 StreamWriter이 (익명 아닌?) StreamWriter이 작동하지 않는 이유는 무엇입니까?

+2

가 나는'StreamWriter'가 실제로 암시 자동으로 플러시합니다'using' 블록을 사용하여 호출되는 플러시와'Dispose' 방법까지 아무것도 _write_ 않습니다 같은데요. 편집 : 참고 : 'StreamWriter'에는이 동작을 제어 할 수있는 [AutoFlush] (http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush.aspx) 속성이 있습니다. 쓰기를 할 때마다 스트림을 플러시합니다. 기본적으로 'false'라고 추측합니다. –

+2

이것은 이미 답변되었지만 왜 그런 형식의 코드를 원하십니까? IMO를 읽고 이해하는 것은 끔찍한 일이며 간단한 서식 오류를 통해 버그를 도입함으로써 위험이 증가합니다. 저는 항상 중괄호를 열었습니다. – TheCodeKing

+0

@TheCodeKing 이미 답변이 되었더라도 링크를 제공 하시겠습니까? 나는 정직하게 그것을 찾았고 게시하기 전에 모든 제안 된 답변을 보았고 (주로 익명의 기능을 사용했기 때문에) 답변을 찾지 못한 것을 보았습니다. 또한 나는 가장 많은 것들을 토론하기 위해 여기에와 있지 않습니다. 부분적인 문체와 선호도를 기반으로합니다. 실제로 요구되지 않는 중괄호로 흩어져있는 IMO 코드는 읽기가 더 어렵습니다. –

답변

19

그것은 소리. 그것은 StreamWriter를 보이는

http://msdn.microsoft.com/en-us/library/system.io.stream.flush.aspx

,이 경우, 최종 목적지에 파일을 쓰기 전에 버퍼에 기록합니다. 또한의 autoflush 속성을 설정하고 명시 적으로 플러시 할 필요가 없습니다 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush.aspx

당신이 "사용"블록을 사용할 때, 그것은는 StreamWriter를에 처분 호출, 귀하의 질문에 대답 할해야 차례로 호출 세척한다.

+0

익명의'StreamWriter'에 AutoFlush 속성을 설정하는 것이 약간 어렵습니다. 그렇죠? 내가 뭔가를 놓치지 않는 한. –

+2

IDisposable을 구현하는 형식의 익명 인스턴스를 절대 만들어서는 안됩니다. – xxbbcc

+2

AutoFlush를 사용하지 않고 개체를 삭제하지 않는 것이 좋습니다. 물건이 일회용이라면 폐기해야합니다. – dtb

7

두 코드 조각의 차이점은 using입니다. The using statement은 블록의 끝에 개체를 배치합니다.

StreamWriter은 기본 스트림에 데이터를 기록하기 전에 데이터를 버퍼링합니다. StreamWriter을 처분하면 버퍼가 플러시됩니다. 버퍼를 플러시하지 않으면 아무 것도 쓸 수 없습니다. MSDN에서

:

당신은 모든 데이터가 올바르게 기본이되는 스트림에 기록되어 있는지 확인하려면 닫기를 호출해야합니다.

은 참조 : 당신이 스트림을 플러시하지 않았다처럼 When should I use “using” blocks in C#?

+0

나는 고통을 느끼지 않을 것입니다. 왜냐하면 저는이 문제를 이미 가정했기 때문에 온라인에서이 정보를 찾을 수있는 부분을 추가 할 수 있습니까? 이것은 내 자신의 이익만큼이나 유익합니다. –

관련 문제