【问题标题】:No working append byte array to existing file using visual Basic无法使用 Visual Basic 将字节数组附加到现有文件
【发布时间】:2015-12-10 12:06:53
【问题描述】:

我有两个字符串,每个字符串是一个 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()

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

【问题讨论】:

  • 你这么聪明,为什么不帮我,还投反对票?
  • 为了记录,我没有对你投反对票,但我可以解释为什么人们这样做。在 StackOverflow 上提问有一定的规则,其中一部分是研究。是的,您需要自己进行研究,即花 1-2 小时自己的时间,尝试自己找出问题并提出问题,但请务必提供您尝试过的一些步骤以及出了什么问题.您应该为所讨论的问题提供简化的测试用例,这通常是您研究的结果。 IE。将 100 步缩小到 3 步,然后将它们作为问题发布。
  • 如果您想获得支持,请从您的问题中删除对 PDF 和 Base64 转换的提及。看看还剩下什么,如果你还有问题。如果是,那很好,您现在已经减少了测试用例。如果不是,您可能需要提出一个标题中包含 PDF 和/或 Base64 的新问题,与 Bytes 或 FileStreams 无关。
  • 编辑您的问题永远不会太晚。包括您发现的内容。多解释一下你的想法。
  • 好的,我试着编辑我的问题

标签: vb.net


【解决方案1】:

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

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

现在,如果您的问题真的是关于将一​​个字节(或一个字节数组)附加到文件中,那么它就像一行代码(或两行,如果您采用 FileStream 方法)一样简单。见以下链接:

还有copy-pasted 为您提供方便(以及converted 从 C# 到 VB.NET):

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

【讨论】:

  • @SilviaParfeni:对不起,这是 C#,我现在已经习惯使用这两种语言了,所以我经常交替使用它们。修正了我刚才的错误。
  • 对不起,但在我的 pdf 中,我只看到第二个字节数组
  • @SilviaParfeni:the second bytes array 是什么意思?追加哪个字节数组无关紧要,第一个、第二个甚至第三个将以完全相同的方式工作。
  • 我现在不建议向您发送我的字符串,但在这里我不能,是大长度 = 62372。通常我有 2 个字符串,这是两个 pdf 文件,然后我写在 2 个不同的文件中都可以,但我必须将它写在一个文件中,但我不能这样做
  • @SilviaParfeni: 62KB 不算什么,这里不要贴,只是为了处理。您可以轻松使用AppendAllBytes,并且不会注意到任何性能影响。你能追加1个字节吗? 2个字节? ... 62372 字节?问题出在哪里?如果您无法追加 1 个字节,请提供此字节码以及如何重现问题。例如,如果您可以附加 20 个字节,但不能附加 21 个字节,请提供两个字符串(或字节码)。这称为减少测试用例,这是开发中标准故障排除的一部分,并且是您就 SO 提出问题之前需要做的事情。
【解决方案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()

【讨论】:

  • 我也试过这样写:fs.Write(binaryData1, 0, binaryData1.Length),但结果相同,第二个字符串没有附加,如果我写在不同的文件中,所有没问题
  • 你如何检查它是否被附加?您是在查看文件中的原始字节,还是打开 PDF?根据 PDF 规范,在文件中的此位置附加此信息可能不正确,因此被忽略等。如果是这种情况,我的编辑可能会有所帮助。
  • 我现在不知道问题出在哪里,但结果不是我需要的:(,谢谢你的帮助
  • 如果我连接字符串二进制数据是 Nothing
猜你喜欢
  • 2011-10-15
  • 2015-03-10
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
相关资源
最近更新 更多