2012-08-15 3 views
2

이 코드를 실행하면.FileStream.Write를 사용할 때 왜 범위를 벗어나나요?

Random R = new Random(); 
     byte[] BA = new byte[8192]; 
     R.NextBytes(BA); 
     FileStream FS = new FileStream(@"D:\Test.txt", FileMode.Append); 
     long end = FS.Seek(0, SeekOrigin.End); 
     if (FS.CanWrite == true) 
     { 
      FS.Write(BA, (int)end, BA.Length); 
      FS.Flush(); 
     } 
     FS.Close(); 

처음 실행할 때 작동합니다. 나는 그것을 두 번째 실행하려고하면이 오류가 발생합니다. 오프셋 길이

배열 범위를 벗어 났거나 개수 소스 컬렉션의 끝에 인덱스에서 요소들의 수보다 크다 .

이 오류를 저촉하지 않습니다. 어떤 도움을 주셔서 감사합니다.

답변

0

배열의 "경계"를 벗어나는 주소의 데이터에 액세스하려고한다는 것입니다.

간단히 말하면, 10 개의 요소로 이루어진 배열이 있다고 가정 해보십시오. "5 번째 요소에서 시작해서 다음 10 개 요소를 주시겠습니까?"라고 묻는다면 무엇을 기대할 수 있습니까? 오류가 발생하여 오프셋 (이 경우 5 번째 요소)과 길이 (이 경우 10)가 범위를 벗어 났음을 알립니다.

+1

오류가 발생하면 0부터 시작하지만 1은 시작할 수 없습니다. – IsaacParker

6

잘못된 인수를 전달하고 있습니다. 에서 :

FS.Write(BA, (int)end, BA.Length); 

두 번째 인수는 당신이 작성하는 파일의 오프셋 (offset)가 아니라, 복사 할 바이트 배열에 오프셋 를 지정합니다. 효과적으로 첫 번째 패스에서 8192 바이트를 복사하고 있으며 두 번째 패스에서는 8193 바이트에서 시작하여 BA에서 복사하도록 FileStream에 지시하고 있습니다. 범위를 벗어 났으므로 물론 충돌합니다. MSDN docs을 참조하십시오.

0을 FS.Write에 전달하여 배열 시작 부분에서 시작하도록 수정하면됩니다.

관련 문제