【问题标题】:Write byte array block by block using FileStream.Write without ArgumentException使用不带 ArgumentException 的 FileStream.Write 逐块写入字节数组
【发布时间】:2015-12-22 20:20:19
【问题描述】:

我有 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 这样的现成方法是不可接受的。

【问题讨论】:

    标签: c# .net arrays console


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多