2015-12-22 2 views
1

У меня есть 256-байтовый массив байтов. Мне нужно записать его в блок блока за кадром (я должен попробовать 10 различных значений между 512 и 1024 байтами). Я написал немного кода на C#, и моя проблема в том, что в конце моего цикла FileStream.Write я нарушаю границы массива.Запись байтового блока по блоку с помощью FileStream.Write без ArgumentException

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

Вот исключение, которое я не знаю, как бороться с:

Необработанное исключение типа «System.ArgumentException» произошло в mscorlib.dll

Дополнительная информация: Смещение и длина была вне границ для массива или число больше, чем количество элементов от индекса до конца коллекции источника.

Кстати, использование готовых методов, таких как File.WriteAllBytes или File.WriteAllText, неприемлемо.

ответ

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