2012-03-19 5 views
0

StreamWriter를 사용하여 하나의 파일에서 다른 파일로 청크를 복사합니다. 두 파일 모두 동일한 원격 위치에 있지만 프로세스는 로컬 컴퓨터에서 실행됩니다. 네트워크 장애가 발생할 경우 복구하고 계속 진행하려고합니다. 내 코드를 단계별로 실행하고 특정 순간에 네트워크 연결을 해제하여 시뮬레이션하고 있습니다.네트워크 복구 실패 후 스팀 작성기 처리

문제는 내가 네트워크를 다시 가져올 때 StreamWriter로 아무 것도 할 수 없다는 것입니다. Flush(), Close() 또는 Dispose()을 호출하면 IOException "지정한 네트워크 이름을 더 이상 사용할 수 없습니다."가 throw됩니다. 내 코드는 다음과 같습니다.

int charsToRead = 100; 
while(!inputFileStream.EndOfStream) 
{ 
    char[] block = new char[charsToRead]; 
    int charsRead = inputFileStream.ReadBlock(block, 0, charsToRead); 
    outputFileStream.Write(new string(block, 0, charsRead)); 
    outputFileStream.Flush(); 
} 

네트워크 장애로부터 복구 한 후 StreamWriter를 계속 유지하는 가장 좋은 방법은 무엇입니까? 감사.

업데이트 : 텍스트 파일을 사용하고 있습니다.

+2

Using-block에 넣으려고 했습니까? – Koen

+0

@Koen 어떻게 도움이 될까요? – Default

+0

이 질문에 대한 답변은 아니지만 'StreamReader/-Writer'는 바이트를 읽지 않고 ** 문자 *를 읽어야한다는 것을 알아야한다고 생각합니다. 실제로'char []'을 할당했지만 변수'bytesRead'를 호출했습니다. 이것은 틀 렸습니다. 파일이 * text * 파일 인 경우에만'StreamReader/-Writer'를 사용해야합니다. 어떤 종류의 데이터라도 복사하고 싶다면,'FileStream' (File.Open()을 사용하여 생성)을 사용하십시오. – Timwi

답변

0

네트워크 연결이 작성되는 도중에 대상 파일이 어떻게 보이나요? 복구 전략이 필 요에 따라 달라 지므로 이는 중요합니다.

대상 파일이 0 바이트로 비워진다는 것이 예상됩니다. 그런 경우 불행히도 이미 복사 된 데이터가 없어 복사 프로세스를 재개 할 수 없습니다. 이제 스트림을 다시 인스턴스화하고 처음부터 복제본을 다시 시작할 수 있습니다. 대용량 파일의 경우 이는 일시적인 네트워크 오류가 항상 발생하는 경우 결코 완료되지 않을 수도 있음을 의미합니다.

그러나 대상 파일이 네트워크 장애 발생에도 성공적으로 기록 된 경우 File.Append()을 사용하여 파일을 다시 열고 복사 프로세스를 계속할 수 있습니다. 읽기와 쓰기가 다시 동기화되도록 inputFile.Position = outputFile.Position을 사용해야합니다.

입력 파일에 대한 네트워크 연결이 실패하면

은 (당신이에서 읽고있는 사람은) 단지 File.Open() 그것을 다시 열고 다시 inputFile.Position = outputFile.Position을 설정합니다.

위의 모든

당신이 가정하는 (나에게 당신이 StreamReader를 사용 문자을 읽을 당신이 게시 한,보다 더 적절한 접근 방식을 보인다 바이트로 데이터를 읽어 Stream를 사용한다고 가정 입력이 텍스트 파일).

+0

텍스트 파일 작업을 위해 StreamReader/Writer를 사용하고 있습니다. 코드가 프레임 워크의 일부이기 때문에 StreamReader를 사용하지 않는 것이 좋으며 그 토끼 구멍을 내려 가고 싶지 않습니다. 네트워크가 중단 된 후에도 대상 파일은 이전에 작성된 텍스트와 그대로 유지됩니다. 현재 성공적으로 복사 된 문자 수를 추적합니다. 그 다음 입력 파일을 다시 열고'inputFileStream.BaseStream.Seek (charsCopied, SeekOrigin.Begin)'을 사용하여 마지막 문자를 찾습니다. 이것은 잘 작동합니다. 하지만 출력 파일을 다시 여는 데 문제가 있습니다. 나는 또한 성공과 함께 outputFileStream = null 시도했다. – nthpixel

+0

① outputFileStream을 명시 적으로 닫아야합니다 (가급적이면'using' 문으로). ② 대상 파일을 검사하는 것 외에는 얼마나 많은 문자가 성공적으로 복사되었는지 알 수있는 방법이 없습니다. 예외를 던지는'Write'에 대한 어떤 특별한 호출도 성공할 수도 실패 할 수도있었습니다. ③ 나는 그 "토끼의 구멍"주장을 사지 않는다. 당신은 잘못된 도구를 사용하여 자신의 토끼 구멍을 파고 있습니다. ④'.Seek (x, SeekOrigin.Begin)'은'.Position = x'와 정확히 같습니다. – Timwi

관련 문제