2013-01-31 1 views
2

TextWriter를 사용하는 경우 스트림을 절단하는 방법 : 나는 TextWriter를 사용하여 내 XDocument 스트림에 직렬화 한 후 종료 후 스트림을 절단 할이 조각은 매우 자명해야

XDocument xd = .... 
using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.ReadWrite)) 
{ 
    using (TextWriter tw = new StreamWriter(fs)) 
    { 
    xd.Save(tw); 
    } 
    fs.Flush(); 
    fs.SetLength(fs.Position); 
} 

을 . 불행히도 Save() 작업은 스트림을 닫아 내 Flush() 호출이 예외를 생성합니다.

현실 세계에서 필자는 실제로 파일에 직렬화하지는 않지만 내 제어 밖에있는 다른 종류의 스트림을 직렬화하므로 파일을 먼저 삭제하는 것만 큼 간단하지 않습니다. 당신이 스트림

using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.ReadWrite)) 
{ 
    using (TextWriter tw = new StreamWriter(fs)) 
    { 
    tw.Flush(); 
    xd.Save(tw); 
    fs.SetLength(fs.Position); 
    } 
} 
+0

Andy는'using' 절 주위에 코드를 래핑 할 때 프로세스가'using() {}'블록을 벗어나면 객체가 자동으로 삭제되고 기본 객체가 닫힙니다. – MethodMan

+0

Andy가 궁금한 점이 있으면 어떻게/어디에서'XDocument xd = ....'를 사용하고 있습니까? – MethodMan

답변

2

당신은이 작업을 수행해야합니다. 마지막 매개 변수를 주목하십시오. 스트림을 열어 두라고 말할 수 있습니다.

+0

xd.Save()를 호출 한 후 xd.Flush()를 호출해야 할 수도 있습니다. 그렇지 않으면 fs에 버퍼가 플러시되지 않았을 수 있습니다. –

+0

좋은 캐치 나는 그의 코드를 복사 할 때 나의 실수를 업데이트 할 것이다. – MethodMan

+0

@MatthewWatson : 나는 당신이'tw.Flush()'를 의미했다고 생각한다. 감사합니다. –

2

에게 StreamWriter를 생성자의 사용 this overload를 세척 할 경우

+0

고마워 - 내가 찾던 대답이 아니지만 과부하에 대해 알지 못했고 앞으로는 분명히 사용할 것이다. – Andy

0

Save이 스트림을 닫고 있습니까? TextWriterusing 끝에서 닫힙니다. 아마도 이것은 작동합니다 : 나는 또한 기본이되는 스트림의 높이를 일으키는 TextWriter를 플러시

using (FileStream fs = new FileStream("test.txt", FileMode.Open, FileAccess.ReadWrite)) 
{ 
    var TextWriter tw = new StreamWriter(fs); 
    try 
    { 
    xd.Save(tw); 
    tw.Flush(); 
    fs.SetLength(fs.Position); 
    } 
    finally 
    { 
    tw.Dispose(); 
    } 
} 

참고. FileStream을 플러시하는 경우에만 TextWriter에 버퍼링 된 데이터가 포함될 수 있습니다.