[英]Why can't I append a new byte array to a file using FileStream?
我正在尝试多次将字节数组写入文件。 FileMode 设置为 Append,如果文件不存在则创建文件,否则打开文件并按照所述查找文件末尾。 问题是当写入现有文件时,它会被覆盖,而不是附加新的字节数组。 这里的所有都是它的。
void WriteToFile()
{
byte[] buffer = new byte[16 * 1024];
int num;
using (FileStream dest_stream = new FileStream(filename, FileMode.Append, FileAccess.Write))
{
while (num = ReadFromAnotherStream(my_other_stream, ref buffer) > 0)
dest_stream.Write(buffer, 0, num);
}
}
这个 function 偶尔会被调用。 如果文件已经存在,则寻找文件末尾并从那里继续写入,否则创建一个新文件并写入数据。
当它应该 append 时,它会覆盖......它不会 append。
它应该 append 到文件而不是覆盖它。
没有抛出错误。
对 FileStream 使用Seek
什么都不做。
当它覆盖时,数据是正确的,但是它需要附加在前一个数据的末尾,而不是覆盖。
我们无法判断您的代码有什么问题,因为您没有包含ReadFromAnotherStream
的代码。 但是这里有一些代码可以满足您的要求,并且可以正常工作:
/// <summary>
/// Appends the contents of the file at inputFilePath to the file at pathToAppendTo
/// </summary>
void Append(string inputFilePath,string pathToAppendTo)
{
var buffer = new byte[16];
using FileStream source = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read);
using FileStream destinationStream = new FileStream(pathToAppendTo, FileMode.Append, FileAccess.Write);
while (TryRead(source, buffer, out int bytes))
{
destinationStream.Write(buffer, 0, bytes);
}
}
private bool TryRead(FileStream source, byte[] buffer, out int bytesRead)
{
bytesRead = source.Read(buffer, 0, buffer.Length);
return bytesRead > 0;
}
这是一个单元测试来验证它是否有效:
[TestMethod]
public void TestWriteFile()
{
var inputFileName = "C:/fileYouWantToCopy";
var outputFileName = "C:/fileYouWantToAppendTo";
var originalFileBytes = GetFileLength(outputFileName);
var additionalBytes = GetFileLength(inputFileName);
Append(inputFileName,outputFileName);
Assert.AreEqual(GetFileLength(outputFileName), originalFileBytes + additionalBytes);
}
private long GetFileLength(string path) => new FileInfo(path).Length;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.