2009-08-08 97 views
0

我連接數據文件,但問題是我看到一些額外的字節,這些文件連接在一起。新文件有額外的字節。我曾認爲這可能是編碼問題。在連接數據文件時獲取額外的HEX字節

下面是我試圖用來連接文件的方法。第一個例子我得到額外的0xA0 0x00字節。

 Dim inputfiles() As String = Directory.GetFiles(sourcedir, pattern) 

    Dim bufSize As Integer = 1024 * 64 
    Dim buf As Byte() = New Byte(bufSize) {} 

    For Each inputfile As String In inputfiles 

      Using fs As New FileStream(inputfile, FileMode.Open, FileAccess.Read) 
       Dim arrfile() As Byte = New Byte(fs.Length) {} 
       fs.Read(arrfile, 0, arrfile.Length) 
       fs.Close() 

       Using fo As New FileStream(outfilename, FileMode.Append, FileAccess.Write) 
        Using bw As New BinaryWriter(fo) 
         bw.Write(arrfile, 0, arrfile.Length) 
         bw.Close() 
         fo.Close() 
        End Using 
       End Using 

      End Using 
     Next 

而第二個我只得到0xA0字節。

 For Each inputfile As String In inputfiles 
      Using fs As New FileStream(inputfile, FileMode.Open, FileAccess.Read) 
       Using sr As New StreamReader(fs, Encoding.ASCII) 
        While Not sr.EndOfStream 
         Using fo As New FileStream(outfilename, FileMode.Append, FileAccess.Write) 
          Using sw As New StreamWriter(fo, Encoding.ASCII) 
           sw.Write(sr.ReadToEnd) 
           sw.Close() 
           fo.Close() 
          End Using 
         End Using 
        End While 
       End Using 
      End Using 
     Next 

感謝您的幫助提前。

回答

0

的字節結束了在每個文件的結尾....

這可能是一個黑客,但這裏是我這裏是我的解決方案想出了。

因爲每次我添加一個文件時,我得到了兩個額外的字節,我從新的字節數組長度減去2。

Private Sub ConcatFiles(ByVal sourcedir As String, ByVal outfilename As String, ByVal pattern As String) 

    Dim inputfiles() As String = Directory.GetFiles(sourcedir, pattern) 
    Dim bufSize As Integer = 1024 * 64 
    Dim buf As Byte() = New Byte(bufSize) {} 

     Using fo As New FileStream(outfilename, FileMode.Append, FileAccess.Write) 

      For Each inputfile As String In inputfiles 

       Using fs As New FileStream(inputfile, FileMode.Open, FileAccess.Read) 
        Dim arrfile() As Byte = New Byte(fs.Length - 2) {} 
        fs.Read(arrfile, 0, arrfile.Length) 
        fo.Write(arrfile, 0, arrfile.Length) 
       End Using 

      Next 

    End Using 

End Sub 
2

0xA0 0x00是一個UTF-16換行符。第一個代碼片段使用UTF-16(用於字符串的默認.NET編碼)和第二個ASCII。

在您的第一個代碼片段中,BinaryWriter支持以特定編碼編寫字符串。

BinaryWriter writer = new BinaryWriter(stream, Encoding.ASCII); 
0

在這裏黑暗只是一個鏡頭,但如果這些文件實際上編碼爲UTF-8/16/32(而不是ASCII),你可能會看到它們之間的UTF BOM(Byte Order Mark)。

嘗試將您的編碼更改爲UTF-8,如果它們是文本,則在閱讀時給它們一個編碼。

注意UTF-8是ASCII的超集,因此無論如何它都是更好的方式。

0

你爲什麼要用BinaryWriter?您可以直接寫入流。

一些一般性意見:

  • 你不需要,如果您使用的是Using聲明
  • 如果複製二進制文件你肯定不顯式地關閉流等想把它們當作文本。遠離TextReader/TextWriters
  • 當你複製一個流時,你通常應該循環讀取一個塊並寫出來,注意Stream.Read的結果。這意味着你最終不會依靠:
    • 在一個被讀取的文件長度保持相同
    • 所有數據去
    • 有足夠的內存首先把它讀完了一氣呵成
  • 爲什麼你重新打開輸出流幾次?只需打開一次並繼續寫入。
  • 您究竟如何確定輸入和輸出文件的內容?你使用十六進制編輯器嗎?我想知道「額外」字節是否真的在輸入文件中,但是如果您正在使用文本編輯器查看文件,您只是沒有注意到它們。

這裏的VB版的方法,我發現有用:

Public Shared Sub CopyStream(ByVal input As Stream, ByVal output As Stream) 
    Dim num As Integer 
    Dim buffer As Byte() = New Byte(&H2000 - 1) {} 
    Do While (num = input.Read(buffer, 0, buffer.Length) > 0) 
     output.Write(buffer, 0, num) 
    Loop 
End Sub 

呼叫數次,每一個輸入文件,但具有相同的輸出,每次流。 (不要關閉它調用之間,很明顯。)

+0

我使用BeyondCompare3和V TheFileViewer查看文件。 你是對的我遇到了這些方法碰到2gig文件限制的問題。 – 2009-08-08 19:32:17

相關問題