2010-08-06 2 views
-2

아래 코드가 입력 파일에 동일한 출력 파일을 생성하지 않는 이유는 무엇입니까?FileStream 클래스를 사용하여 파일을 복사 할 때 출력이 입력과 일치하지 않는 이유는 무엇입니까?

아이디어는 파일의 일부를 버퍼링하고 작은 버퍼에서 씁니다 (이것은 파일을 스트리밍하는 큰 프로젝트에서 오류를 재현하는 작은 프로그램입니다). 16 진수 편집기 비교 도구에서 이러한 파일을 검사하면 출력 파일이 다소 다릅니다.

fsIn = new FileStream("c:\\wmvs\\Wildlife.wmv", FileMode.Open, FileAccess.Read); 
     fsOut = new FileStream("c:\\Users\\public\\documents\\compare\\out.wmv",  FileMode.Create, FileAccess.Write); 

     bData = new byte[fsIn.Length/10]; 
     bOut = new byte[524288]; 

     fsIn.Read(bData, 0, bData.Length); 

     bool bGo = true; 

     while (bGo) 
     { 
      if (nWrittenOut == bData.Length) 
      { 
       fsIn.Read(bData, 0, bData.Length); 
      } 

      if (nWrittenOut + bOut.Length >= bData.Length) 
      { 
       Array.Clear(bOut, 0, bOut.Length); 

       int nWhatsLeft = bData.Length - nWrittenOut; 
       Array.Copy(bData, nWrittenOut, bOut, 0, nWhatsLeft); 

       fsIn.Read(bData, 0, bData.Length); 
       nWrittenOut = 0; 
       int nBufPos = nWhatsLeft; 

       nWhatsLeft = bOut.Length - nWhatsLeft; 
       Array.Copy(bData, nWrittenOut, bOut, nBufPos, nWhatsLeft); 
       nWrittenOut += bOut.Length; 

      } 
      else 
      { 
       Array.Copy(bData, nWrittenOut, bOut, 0, bOut.Length); 
       nWrittenOut += bOut.Length; 
      } 

      fsOut.Write(bOut, 0, bOut.Length); 
      fsOut.Flush(); 

      if (fsOut.Position >= fsIn.Length) 
       bGo = false; 
     } 

    } 

나는 아래의 모든 대답을 시도했지만 아무런 효과가 없습니다. 그것은 코드에서 내 논리가 있어야합니다. 그러나 나는 문제를 볼 수 없다 ???? 그것은 출력 파일 bouut의 길이에 eqivalent 전체 덩어리 실종 보인다.

+1

파일 복사가 가능한 경우 사용할 수있는 복사 메커니즘을 사용합니다. File.Copy가 있다고 생각합니다. 스트림을 읽고 다른 스트림을 작성하려면 당신이 여기에있는 많은 코드에 대해 당혹 스럽습니다. –

+1

좀 더 자세한 설명이 담긴 제목은 아마도 더 많은 답변을 얻을 것입니다. – Nacho

+0

데이터가 꺼져있는 방법을 설명하면 도움이됩니다. 새 라인이 변경 되었습니까? 파일에 0 문자가 기록 되었습니까? 등등. 구체적이어야하고, 당신의 질문 제목에 관해서는 대단히 나쁘다. 이것은 개인 포럼이 아닙니다. –

답변

2

내가하는 일을 잘 모르겠지만이 작업을 시도해보십시오. FileStream을 통한 읽기 및 쓰기가 불가 지론을 ​​인코딩하지 않을 수 있으므로 스트림을 고수하고 바이트를 그냥 지나칠 수 있습니다.

using (Stream inStream = File.Open(inFilePath, FileMode.Open)) 
{ 
    using (Stream outStream = File.Create(outFilePath)) 
    { 
     while (inStream.Position < inStream.Length) 
     { 
      outStream.WriteByte((byte)inStream.ReadByte()); 
     } 
    } 
} 
+1

a에서 b로 개별 바이트 크롤링을 보려면이 솔루션을 사용하는 것이 좋습니다. 다른 말로하면 : 그것은 지옥처럼 느립니다. http://msdn.microsoft.com/en-us/library/dd782932.aspx 또는 http : // stackoverflow를 사용하는 것이 더 좋습니다.com/questions/230128 - 아니면 그냥 http://msdn.microsoft.com/en-us/library/c6cfw35a.aspx – dtb

+1

@ dtb : 가능한 단순한 예제를 포스터로 유지하려고하면 다음과 같이 할 수 있습니다. 그가 그림으로 시작하기 위해 노력한 후에 설정된 크기의 버퍼를 사용하도록 알아 낸다. 그리고 File.Copy는 이미 위의 주석에서 제안했습니다. –

+2

@dtb, 사용자가 지정한 버퍼 크기를 허용하는'.CopyTo()'의 오버로드에 주목하십시오. –

1

아마도 이진 파일에서 발생하는 모든 0x0A가 CR/LF로 변환되도록 텍스트 모드에서 읽기/쓰기 일 것입니다.

+0

아니요 ... 바이트 배열로 읽고 쓰는 중입니다. – David

1
당신이되고있는 Environment.NewLine 번역 피하기 위해 BinaryReaderBinaryWriter를 사용해야합니다

"제공합니다."

0

fsIn.Read 메서드의 반환 값을 확인해야합니다. Read 메서드는 요청한 바이트 수를 항상 읽지는 않습니다. 결과에 여분의 "0"바이트가 표시되는 경우 이것이 원인 일 수 있습니다.

0

fsIn.Read()의 반환 값을 확인하지 않습니까? Windows 플랫폼에 대한 (개발자) 경험이 없지만 항상 정확히이 바이트 수를 읽을 수 있습니까? 파일 끝은 어때? :)

관련 문제