2011-05-11 5 views
8

현재이 바이트 배열을 문자열로 변환하고이 문자열에 데이터를 추가하는 이진 파일 (File.ReadAllBytes)에서 데이터를 읽습니다. 마지막으로 문자열을 바이트 배열로 변환하고 데이터를 다시 새 파일에 기록합니다.데이터를 바이트 배열에 추가하십시오.

예 -이 방법은 상당히 바보입니다. 그리고 데이터를 바이트 배열의 끝에 (바이트 형식으로) 추가 할 수있는 방법이 있는지 궁금합니다.

String s = @"C:\File.exe"; 
Byte b[] = File.ReadAllBytes(s); 

String NewString = ConvertToString(b[]); 

NewString = NewString + "Some Data"; 

b[] = ConvertToByteArray(NewString); 
File.WriteAllBytes(b[]); 

// ConvertToByteArray 및 ConvertToString 문자열> 바이트> 문자열 변환 기능을 나타냅니다.

b[] = file.readallbytes(s) 
b = b + "new Data" 
file.writeallbytes(b[]) 

이 문제에 어떤 통찰력 주셔서 대단히 감사합니다 내가하고 싶은 무엇

. 당신이 정말로 당신의 버퍼가 더 큰 있도록 다음 단지 Array.Resize를 사용하여 전체 파일을 읽을 필요가있는 경우

using (var fs = new FileStream(s, FileMode.Open, FileAccess.ReadWrite)) 
{ 
    fs.Seek(SeekOrigin.End); 
    fs.Write(data, 0, data.Length); 
} 

, 복사 :

답변

16

Streams 작업에 익숙해 져야합니다.이 경우 불쾌한 배열없이 똑같은 것을 달성하려면 MemoryStream을 사용할 수 있습니다.

byte[] bytes = File.ReadAllBytes(inFilePath); 
using (MemoryStream ms = new MemoryStream()) 
{ 
    // You could also just use StreamWriter to do "writer.Write(bytes)" 
    ms.Write(bytes, 0, bytes.Length); 

    using (StreamWriter writer = new StreamWriter(ms)) 
    { 
     writer.Write("Some Data"); 
    } 

    File.WriteAllBytes(outFilePath, ms.ToArray()); 
} 

이 코드는 전체 코드가 코드보다 복잡해 보이지만 실제로는 코드가보다 효율적입니다.

물론 다른 파일 (또는 심지어 같은 파일)에 쓰는 경우 파일에 직접 쓸 수 있으며 byte 배열 또는 MemoryStream의 필요성을 건너 뛸 수 있습니다. 이는 스트림의 아름다움입니다. 그냥 파일에 무언가를 추가하려면

+1

이것은 제가 생각한대로 정확하게 작동했습니다. 시간 내 주셔서 대단히 감사합니다. (여러분 모두). –

5

사용 FileStream, 파일의 끝에 찾아, 당신이 필요로 쓰기 추가하려는 부분 위로 이동합니다.

var data = File.ReadAllBytes(s); 
Array.Resize(ref data, data.Length + toAppend.Length); 
Array.Copy(toAppend, 0, data, data.Length - toAppend.Length, toAppend.Length); 
File.WriteAllBytes(s, data); 

"속기"가 없습니다. 죄송합니다. : \


이의 전체 포인트는 바로 File.AppendAllText을 사용합니다 문자열을 추가하는 경우 !

+0

이진 파일을 읽기 위해 filestream을 사용하는 것이 좋습니다. –

+0

@ 에반 : 아뇨, 죄송합니다. 제 편집문을보십시오. 그것은 실제로 전체 파일을 읽을 필요가 없다고 가정합니다. 만약 그렇다면'Array.Resize'를 사용하십시오. – Mehrdad

0

두 개의 개별 배열의 합계 크기로 새 배열을 만든 다음 배열을 복사합니다.

+0

"sum"으로 "연결"또는 뭔가를 의미한다고 생각하십니까? – Mehrdad

+0

아니, 나는 그가 "합계"를 의미한다고 생각한다 –

+0

@Mehrdad a1.Lenght + a2.Lenght. 내 영어는 좋지 않고 슬프지만 사실이 아닙니다. –

2

, 당신이하여 FileStream과 StreamWriter를를 사용해야합니다 :

 using (var f = File.Open(@"C:\File.exe", FileMode.Append)) 
     using (var w = new StreamWriter(f)) 
      w.Write("new Data"); 

또는 이와 유사한.

당신은 단지 몇 바이트를 추가하려면 :

 using (var f = File.Open(@"C:\File.exe", FileMode.Append)) 
     { 
      byte[] buf = new byte[] { 69, 65, 66, 67 }; 
      f.Write(buf, 0, buf.Length); 
     } 
3

AddRange를 사용하여 초기 ReadAllBytes에서 모든 바이트를 추가합니다 List<Byte>를 사용하고 바이트의 다음 세트를 추가합니다. 마지막으로 CopyTo을 사용하여 모든 바이트를 배열 (크기 List.Length)로 복사하십시오.

+0

나는 단지 호기심이 많았는데, 다음과 같은 방법에 대한 간단한 예를 나에게 줄 수 있다고 생각하니? 바이트 [] bData; 문자열 sData = "테스트 데이터"; bData = bData + Convert.ToByte (sData); 나는 목록에서 약간의 독서를했다. 그러나 나는 아직도 다소 혼란 스럽다. –

관련 문제