2010-04-12 4 views
2

일부 파일 조작을 조롱하려고합니다. "진짜"개체에서 내가 가진 :기본 스트림의 처리를 피하십시오.

StreamWriter createFile(string name) 
{ 
    return new StreamWriter(Path.Combine(_outFolder, name), false, Encoding.UTF8)); 
} 

을 내가 가지고 같은 을 거라고 mock 객체에서 :

_FILES
StreamWriter createFile(string name) 
{ 
    var ms = new MemoryStream(); 
    _files.Add(Path.Combine(_outFolder, name), ms); 
    return new StreamWriter(ms, Encoding.UTF8)); 
} 

나중에 검사를 위해 만든 파일을 저장하는 사전이다. 소비자가에서는 StreamWriter를 닫을 때

그러나, 그것은 또한는 :-(... MeamoryStream을 처분

이 추구하는 방법에 대한 어떤 생각?를 StreamWriter를의

답변

4

MemoryStream을 하위 클래스로 만들면 작동하지만 ManualDispose 메서드를 호출하여 기본 스트림을 닫아야합니다.
잘 모르겠지만 범위를 벗어날 때이 개체가 가비지 수집됩니다.

public sealed class ManualMemoryStream : MemoryStream 
{ 
    protected override void Dispose(bool disposing) 
    { 
    } 
    public void ManualDispose() 
    { 
     base.Dispose(true); 
    } 
} 

편집 : 당신은 MemoryStream을 플러시하고 상단에서 읽을 준비되도록하려면
이 대안입니다.

public sealed class ManualMemoryStream : MemoryStream 
{ 
    protected override void Dispose(bool disposing) 
    { 
     Flush(); 
     Seek(0, SeekOrigin.Begin); 
    } 
    public void ManualDispose() 
    { 
     base.Dispose(true); 
    } 
} 
+0

나는 이것을 좋아한다! 그러나 플러시()는 불필요합니다. 플러싱을 필요로하는 "위"스트림입니다.이 시점에서 이미 완료되었습니다. –

+0

@danbystrom, 도움이되어 기쁩니다. 맞습니다. StreamWriter는 처리되기 전에 플러시됩니다. 그러나 시크 (Seek)는 유용 할 수 있습니다. –

3

성격이 처리하는 것입니다 기본이되는 스트림은이 자체가 삭제되는 경우. 단, StreamWriter를의 하위 클래스를 생성 (돌아 오는)에 의해 (내가 LeakyStreamWriter를 호출하는거야),이 기본 동작을 방지 할 수 있어야한다.

public class LeakyStreamWriter : StreamWriter 
{ 
    public override void Close() 
    { 
     BaseStream.Close(); //close, but do not dispose 
    } 

    protected override void Dispose(bool disposing) 
    { 
     //do nothing here 
    } 
} 

StreamWriter에 기본 스트림 이외의 다른 구성 요소가 없다는 가정하에, StreamWriter의 해체를 확인하여 실제로이 두 메서드에서 수행 된 내용을 확인하고자 할 수 있습니다.

어쨌든 위의 하위 클래스를 사용하면 스트림 작성기가 닫힐 때 기본 스트림이 닫히지 만 처리되지 않을 수 있습니다.

+0

충분! Close가 호출되지 않고 Dispose에 Flush()를 추가해야합니다. 그런 다음 바람처럼 작동하는 것 같습니다. –

+0

Dispose 재정의에서 base.Dispose (false)를 호출하기 만하면됩니다. StreamWriter 내부 리소스를 적절하게 처리하면서 기본 스트림을 그대로 유지합니다 (정의에 따라 관리되는 리소스 임). –