使用visual Basic没有工作将字节数组附加到现有文件

时间:2015-09-14 13:07:03

标签: vb.net

我有两个字符串,每个字符串都是PDF礼仪,我必须将这两个礼仪写成PDF文件。为此,我将每个字符串转换为字节数组(我不知道这是否是最好的方法),每个我写入PDF文件。当我把一个礼仪写成PDF文件都很好的时候,我看到了礼仪,但后来我尝试追加第二个,结果是一样的,进入文件只是第一个礼仪。例如,这段代码写出了第一个礼仪和所有工作的好处:

Dim fs As FileStream = New FileStream(fullFileName, FileMode.CreateNew)
fs.Close()
fs = New FileStream(fullFileName, FileMode.Append)
Dim str As String = GetPDFString(27)
Dim binaryData As Byte() = ConvertStringToByte(str)
fs.Write(binaryData, 0, binaryData.Length)
fs.Close()

但如果我想使用此代码在同一个PDF文件中附加第二个礼节......这不会附加。

Dim fs As FileStream = New FileStream(fullFileName, FileMode.CreateNew)
fs.Close()
fs = New FileStream(fullFileName, FileMode.Append)
Dim str As String = GetPDFString(25)
Dim str1 As String = GetPDFString(27)
Dim binaryData As Byte() = ConvertStringToByte(str)
Dim binaryData1 As Byte() = ConvertStringToByte(str1)
fs.Write(binaryData, 0, binaryData.Length)
fs.Write(binaryData1, 0, binaryData1.Length)
fs.Close()

两者都有相同的结果,我不明白为什么第二个礼节没有附加?非常感谢你。

2 个答案:

答案 0 :(得分:4)

您的问题标题表明您询问的是如何将字节附加到FileStream而不是PDF,而不是关于Base64字符串转换(您在代码中使用)。

在向StackOverflow提问之前,您需要确保一次只传达一个问题。删除所有不相关的内容,并准备一个我们可以在全新的VS项目中使用的代码示例,以便重现您的问题并帮助您解决它。

现在,如果您的问题实际上是关于将一​​个字节(或字节数组)附加到文件,它就像一行代码一样简单(如果保持FileStream方法,则为两行)。见以下链接:

此外,copy-pasted为了您的方便(以及从C#到VB.NET的converted):

Dim appendMe As Byte() = New Byte(999) {}
File.AppendAllBytes("C:\test.exe", appendMe)

或者,对于avoid memory overflow,如果您的字节数组预计足够大:

Public Shared Sub AppendAllBytes(path As String, bytes As Byte())
   'argument-checking here.

   Using stream = New FileStream(path, FileMode.Append)
       stream.Write(bytes, 0, bytes.Length)
   End Using
End Sub

答案 1 :(得分:2)

这一行:

fs.Write(binaryData1, binaryData.Length + 1, binaryData1.Length)

特别是第二个参数(binaryData.Length + 1),你告诉它开始从binaryData1的错误位置追加。例如,如果长度为3个字节,那么binaryData也是如此,它不会附加任何内容。它应该类似于第一个.Write行:

fs.Write(binaryData1, 0, binaryData1.Length)

因此它会附加 binaryData1的所有。它仍会在 binaryData之后附加 - 您无需在此行中指定前一binaryData的长度。

或者,完全绕过上述内容,在编码/将它们写入文件之前连接两个字符串:

Dim fs As FileStream = New FileStream(fullFileName, FileMode.CreateNew)
fs.Close()
fs = New FileStream(fullFileName, FileMode.Append)
Dim str As String = GetPDFString(id, token, depot, 25)
Dim str1 As String = GetPDFString(id, token, depot, 27)
Dim binaryData As Byte() = Convert.FromBase64String(str & str1) 'concatenate strings
fs.Write(binaryData, 0, binaryData.Length)
fs.Close()