2011-12-28 3 views
4

해시를 사용하는 파일을 처리하는 코드를 작성하고 있습니다. 청크를 읽은 다음 해시 한 다음 쓰고 다른 청크를 읽어야합니다.바이너리 리더와 작성기가 동시에 열리십니까?

즉, 많은 읽기와 쓰기가 필요합니다. 나는 어떤 종류의로 실행 기억

BinaryReader br = new BinaryReader (File.OpenRead(path)); 
BinaryWriter bw = new BinaryWriter (File.OpenWrite(path)); 
br.dostuff(); 
bw.dostuff(); 

:

가 그런 짓을하는 것이 가능하고, 만족할 만 ... 나는 이것이 정말 간단 확신 해요,하지만 난 단지 전문가에 의해 실행하고 싶었다 파일 열기 및 쓰기를 시도 할 때 충돌하는 파일 스트림 오류가 발생했으며이를 얻기 위해 무엇을했는지 확신 할 수 없습니다. 문제가되는 두 파일 스트림입니까? 읽고 쓸 스트림을 하나 가질 수 있습니까?

+0

이 부분은 더러워졌습니다. 왜 이렇게하는거야? 어쩌면 당신의 시나리오를 설명 할 수 있을까요? – Matthias

답변

2

완벽하게 가능하고 원하는 기술입니다. 쓰기 방법이 파일의 길이를 변경하지 않고 항상 독자 뒤에 있기 때문에 문제가 발생하지 않습니다. 사실, API 관점에서 볼 때 이것은 사용자가 어디에서 읽을 것인지 어디에 쓸 것인지를 제어 할 수 있기 때문에 바람직합니다. (다른 파일에 쓰는 것이 좋습니다. 암호화 프로세스 중에 잘못된 일이 발생하는 경우 입력 파일이 엉망이되지 않도록하십시오.) 같은

뭔가 : 이제

protected void Encrypt(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[2048]; 

    while (true) 
    { 
     // read 
     int current = input.Read(buffer, 0, buffer.Length); 
    if (current == 0) 
        break; 

     // encrypt 
     PerformActualEncryption(buffer, 0, current); 

     // write 
     output.Write(buffer, 0, current); 
    } 
} 

public void Main() 
{ 
    using (Stream inputStream = File.Open("file.dat", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    using (Stream outputStream = File.Open("file.dat", FileMode.Open, FileAccess.Write, FileShare.ReadWrite)) 
    { 
     Encrypt(inputStream, outputStream); 
    } 
} 

당신은 암호화를 사용하고 있기 때문에, 난 또 다른 전문 스트림에서 실제 암호화를 수행하는 것이 좋습니다. 이렇게하면 코드를 멋지게 정리할 수 있습니다.

class MySpecialHashingStream : Stream 
{ 
... 
} 

protected void Encrypt(Stream input, Stream output) 
{ 
    Stream encryptedOutput = new MySpecialHashingStream(output); 
    input.CopyTo(encryptedOutput); 
} 
+0

나는 둘 다 동일한 파일 스트림을 사용할 수있다. – mowwwalker

+2

@Walkerneo - 당신은 할 수 있지만, 나는 그것을 추천하지 않을 수있다. 파일 handeles는 캐싱으로 최적화되고, Seeking은 덜 최적화됩니다 (테스트를하면 볼 수 있습니다). 그 외에도, 필자의 지적은 API의 유연성과 안전성을 고려하여 읽기와 쓰기 모두 1 개의 파일 핸들만으로 작업 할 때 느슨해 진 것이었다. – Polity