使用没有ArgumentException的FileStream.Write逐块写入字节数组

时间:2015-12-22 20:20:20

标签: c# .net arrays console

我有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);
    }

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

未处理的类型&#39; System.ArgumentException&#39;发生在mscorlib.dll

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

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

1 个答案:

答案 0 :(得分:0)

您只需要确保您的上一次写入只写入文件中剩余的字节数,即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));
}