2009-08-08 89 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

相关问题