目前,我正在从二进制文件(File.ReadAllBytes)读取数据,将此字节数组转换为字符串并将数据附加到此字符串上。最后,我将字符串转换回字节数组并将数据写回新文件。
是的 - 这种方法非常愚蠢,我一直很好奇是否有某种方法可以将这个 new 数据附加到字节数组的末尾(以一个字节)。
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[])
非常感谢您对此事的任何见解。
答案 0 :(得分: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
,寻找文件的末尾,然后写下您需要的内容:
using (var fs = new FileStream(s, FileMode.Open, FileAccess.ReadWrite))
{
fs.Seek(SeekOrigin.End);
fs.Write(data, 0, data.Length);
}
如果你真的需要阅读整个文件,那么只需使用Array.Resize
使你的缓冲区更大,然后复制你想要追加的部分。
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
!
答案 2 :(得分:5)
使用List<Byte>
,使用ReadAllBytes
添加初始AddRange
中的每个字节,然后添加下一组字节。最后,使用CopyTo
将所有字节复制到数组(大小为List.Length
)。
答案 3 :(得分: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);
}
答案 4 :(得分:0)
创建一个大小为两个独立数组之和的新数组,然后将数组复制到它。