繁体   English   中英

使用不带ArgumentException的FileStream.Write逐块写入字节数组

[英]Write byte array block by block using FileStream.Write without ArgumentException

我有256 KB字节数组。 我需要将其逐块写入文件(我应该尝试512和1024字节之间的10个不同值)。 我写了一些C#代码,问题是在FileStream.Write循环的末尾,我打破了数组的界限。

static void Main()
    {
        var sourceArray = new byte[256 * 1024];
        new Random().NextBytes(sourceArray);
        var blockSizes =new[]
        {
            512,
            512 + 512/10,
            512 + (512/10)*2,
            512 + (512/10)*3,
            512 + (512/10)*4,
            512 + (512/10)*5,
            512 + (512/10)*6,
            512 + (512/10)*7,
            512 + (512/10)*8,
            1024
        };
        foreach (var bs in blockSizes)
            using (var fs = new FileStream(bs.ToString(), FileMode.Create))
                for (var i = 0; i < sourceArray.Length; i += bs)
                    fs.Write(sourceArray, i, bs);
    }

这是我不知道如何处理的例外情况:

mscorlib.dll中发生了'System.ArgumentException'类型的未处理异常

附加信息:偏移量和长度超出数组的范围,或者计数大于从索引到源集合末尾的元素数。

顺便说一句,使用File.WriteAllBytes或File.WriteAllText之类的现成方法是不可接受的。

您只需要确保最后一次写入仅写入文件中剩余的字节数,即sourceArray.Length - i

static void Main()
{
    var sourceArray = new byte[256 * 1024];
    new Random().NextBytes(sourceArray);
    var blockSizes = new[]
    {
        512,
        512 + 512/10,
        512 + (512/10)*2,
        512 + (512/10)*3,
        512 + (512/10)*4,
        512 + (512/10)*5,
        512 + (512/10)*6,
        512 + (512/10)*7,
        512 + (512/10)*8,
        1024
    };
    foreach (var bs in blockSizes)
        using (var fs = new FileStream("C:\\tmptmp\\" + bs.ToString(), FileMode.Create))
            for (var i = 0; i < sourceArray.Length; i += bs)
                fs.Write(sourceArray, i, Math.Min(bs, sourceArray.Length - i));
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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