Всех приветствую, вот сделал метод, он читает файл по частям, на вход метода подаем поток, возвращает метод переменную количества блоков, и также возвращает структуру KeyValuePair Не могу сообразить, как выйти правильно из метода с помощью return. Заранее всем спасибо.
public static KeyValuePair<int, byte[]> Read_Blok(Stream stream,out int count_blok)
{
int size = 1024 * 1024;
int count_part = (int) (stream.Length /size );// количество частей
int sizeLastPart = count_part - 1; // размер последней части
byte[] buffer = new byte[size]; // размер буффера
count_blok = 0;
int count;
for (int i = 0; i < count_part; i++)
{
if (i == count_part - 1) // когда достигаем последней части, последняя часть блока может быть меньше чем заданный буфер
{
buffer = new byte[sizeLastPart];
count=stream.Read(buffer, 0, buffer.Length);
count_blok = count_blok + 1;
return new KeyValuePair<int, byte[]>(count_blok,buffer);
}
else
{
count = stream.Read(buffer, 0, buffer.Length);
count_blok = count_blok + 1;
return new KeyValuePair<int, byte[]>(count_blok,buffer);
stream.Position = i * buffer.Length;// сдвигаем позицию в потоке
}
}
}
public static IEnumerable<KeyValuePair<int, byte[]>> Read_Block(Stream stream)
{
const int SIZE_BLOCK = 1024 * 1024; // one megabyte
int index = 0;
while (stream.Position < stream.Length)
{
byte[] buffer = new byte[System.Math.Min(SIZE_BLOCK, stream.Length - stream.Position)];
stream.Read(buffer, 0, buffer.Length);
yield return new KeyValuePair<int, byte[]>(index++, buffer);
}
}
public static void Test()
{
using (FileStream fStream = new FileStream("file name", FileMode.Open))
{
foreach (KeyValuePair<int, byte[]> block in Read_Block(fStream))
{
// process block.Value
}
}
}
Строчка
... = new byte[System.Math.Min(SIZE_BLOCK, stream.Length - stream.Position)];
выделяет память под массив в один мегабайт или, если до конца потока осталось меньше, в столько байт, сколько осталось до конца потока.
Не знаю что не так с вычислением count_part но вот так код не должен изменить свою актуальность и функционал, а @Igor правит ответ с новым вычислением переменной.
public static KeyValuePair<int, byte[]> Read_Blok(Stream stream, out int count_blok)
{
int size = 1024 * 1024;
int count_part = (int)(stream.Length / size);// количество частей
int sizeLastPart = count_part - 1; // размер последней части
byte[] buffer = new byte[size]; // размер буффера
count_blok = 0;
int count;
for (int i = 0; i < count_part; i++)
{
if (i == count_part - 1) // когда достигаем последней части, последняя часть блока может быть меньше чем заданный буфер
{
buffer = new byte[sizeLastPart];
count = stream.Read (buffer, 0, buffer.Length);
count_blok = count_blok + 1;
}
else
{
count = stream.Read (buffer, 0, buffer.Length);
count_blok = count_blok + 1;
stream.Position = i * buffer.Length;// сдвигаем позицию в потоке
}
}
return new KeyValuePair<int, byte[]> (count_blok, buffer);
}
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
При обучении работы с базой данных MS SQL Server, при попытке вывести данные со столбцов ID, Name, Points таблицы users, программа по какой-то причине выдает...
Пишу небольшую программу и возникла проблема в том ,что элемент не добавляется в ListСуть в том, что массив должен дублироваться указанное...
Есть большой текстовой файл (несколько гигов), нужно рассмотреть каждую строку не тратя много памяти
Расклад такой, у меня есть программа на c# она подгружает нужные файлы для работы другой программы на pythonТакие параметры pyinstaller -F --noconsole, программа...