繁体   English   中英

为什么我不能 append 使用 FileStream 将新的字节数组添加到文件中?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM