Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/40: Рейтинг темы: голосов - 40, средняя оценка - 4.65
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271

Чтение файла по частям

29.06.2018, 11:25. Показов 8256. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем здравствуйте, нужно мне считать файл в память, при этом разделить файл на равные куски и потом как то обратиться к этим кускам.
Не понятен механизм разделения самого файла, и как потом к этим кускам обращаться. Заранее спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.06.2018, 11:25
Ответы с готовыми решениями:

Чтение бинарного файла по частям
Нужно разделить бинарный файл на куски и записать каждый в отдельный фаил: если размер файла 7 байт - то должно получится 4 фаила размером...

Загрузка большого текстового файла. Как грузить его по частям
Столкнулся с такой проблемой: при загрузке в "string" большого текстового файла методом "File.ReadAllText" вылетает исключение...

Чтение списка из файла и дальнейшее использование информации из файла
основная using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; ...

36
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
29.06.2018, 11:43
Здравствуйте, для текстового файла можно так порезать примерно ровные куски. Последний кусок будет с довеском.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        static void FileSplit(string name, int count)
        {
            var s = File.ReadAllText("цифры.txt");
            var step = s.Length / count;
 
            string[] array = new string[count];
            for (int i = 0; i < count; i++)
            {
                if (i != count - 1)
                    array[i] = s.Substring(i * step, step);
                else
                array[i] = s.Substring(i * step);
            }
 
            foreach (var item in array)
            {
                Console.WriteLine(item);
            }
        }
1
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
29.06.2018, 11:48  [ТС]
Спасибо за ответ, а если это файл не текстовый, который я хочу считать и он будет не маленького размера, и главное вот все улеглось в массив.верно а как мне обращаться к кускам этого файла,например чтобы взять кусок и что то с ним сделать
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
29.06.2018, 11:58
Мдфв1234, string[] поменять на byte[][]

Цитата Сообщение от Мдфв1234 Посмотреть сообщение
что то с ним сделать
Пример: Элементы массива сохранить в разные файлы, и записать на CD-ROM по 600 мегабайт.

----
Хотя супер-огромные файлы (например фильмы по 25 гигов) надо считывать уже поточно, чтобы буфер был вечно маленьким.
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
29.06.2018, 12:03
Так а конечная цель какая?

Файл можно просто целиком считать в файл в виде массива байтов 'File.ReadAllBytes' и потом обращаться к нужным участкам по вычисляемому индексу (номер фрагмента умноженный на размер фрагмента).

Можно полученный массив байтов разрезать на несколько маленьких массивов и хранить их в виде коллекции. В этом случае доступ к конкретному куску будет по простому индексу, а не по вычисляемому (как в первом случае).

Можно, с целью экономии ресурсов, последовательно считать данные из файла и сложить их в массивы байтов фиксированной длины налету досоздавая новые по мере надобности. В итоге получится то же, что и в предыдущем случае.
0
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
29.06.2018, 12:04  [ТС]
вот как раз вопрос с потоком меня и интересует, а смысл маленького буфера при этой операции какой, вернее почему он должен быть маленьким?
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
29.06.2018, 12:05
Мдфв1234,
Цитата Сообщение от Мдфв1234 Посмотреть сообщение
вернее почему он должен быть маленьким?
Цитата Сообщение от amr-now Посмотреть сообщение
например фильмы по 25 гигов
Не только лишь все люди имеют компьютер с оперативной памятью 25 гигов.
0
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
29.06.2018, 12:08  [ТС]
Вообще вот такую я себе задачу поставил, нужно взять файл , учитывая что он может быть большим, разрезать его на части равные, и эти части поместить например в какую нибудь очередь, и уже из этой очереди брать куски файла этого и что то(мне нужно понять механизм, потому действие не важно) с ним сделать.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
29.06.2018, 12:11
Мдфв1234, условимся, что большой файл не влезет в оперативную память ни в виде массива. ни в виде очереди, ни в виде другой коллекции.

Получается, в оперативной памяти лежит только огрызок.
1
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
29.06.2018, 12:14  [ТС]
да вот это я как раз умом понимаю , но не знаю с какой стороны подступиться, потому пусть каждый кусок файла будет писаться в новый файл, то есть будет один файл на выходе, в который дописывались бы все куски.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
29.06.2018, 12:19
Цитата Сообщение от Мдфв1234 Посмотреть сообщение
не знаю с какой стороны подступиться
две крупные задачи
1) порезать файл на мелкие файлы.
2) собрать мелкие файлы в большой файл.


Берите авторучку и лист бумаги:
в компьютере лежит огрызок и больше ничего не влезает.
Сохранять позицию в любом файле можно в виде целого числа. Считал - передвинул позицию. Записал - передвинул позицию.
1
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
29.06.2018, 12:23
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
static List<byte[]> SplitFile(string fileName, int partSize)
{
    var result = new List<byte[]>();
 
    var fileLen = new FileInfo(fileName).Length;
 
    var totalRead = 0;
    using (var fs = new FileStream(fileName, FileMode.Open))
    {
        while (totalRead < fileLen)
        {
            var part = new byte[fileLen - totalRead < partSize ? fileLen - totalRead : partSize];
 
            totalRead += fs.Read(part, 0, part.Length);
 
            result.Add(part);
        }
    }
 
    return result;
}
Только про метод 'Read' почитайте. Согласно его спецификации он НЕ обязан возвращать то количество байт, которые у него запросили, т.е. в силу разных причин он может вернуть и ноль и меньше запрошенного. Т.е. для максимально правильной реализации нужно проверить сколько байтов реально считалось и, если считалось меньше желаемого, то повторять операцию и досчитывать остаток в тот же буфер по смещению. Здесь не стал усложнять.

Если файл у вас огромный и в память не влазит, то метод можно модифицировать следующим образом:
1. Дать ему доступ к какому-нибудь разделяемому (с другим потоком) ресурсу, например, очереди.
2. В цикле чтения проверять размер очереди. Если кусочков в ней меньше некоторого количества, то досчитывать следующий, если лимит превышен, то делать паузу и ждать, пока обрабатывающий поток справится с предыдущими кусочками.

Если обработка кусков последовательная, то можно рассмотреть другую реализацию - простая обёрка поверх стрима, которая умеет методом 'GetNextPart' вовзращать следующий кусок для обработки. При этом сама обёртка хранит состояние стрима и прочие параметры, заданные при иницилизации (путь к файлу, размер куска, размер буфера, если требуется).
0
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
29.06.2018, 12:23  [ТС]
а наглядно как то можно посмотреть операцию с позициями в файле, то есть по логике мне же надо будет эту позицию в потоке найти , чтобы понять где границы куска и плюс запомнить, откуда начинать другой кусок
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
29.06.2018, 12:30
Мдфв1234, поэтому и говорю, на листе бумаге всё будет понятно по смыслу.

Все границы запоминаются в целых числах. Потом внимательно ещё раз почитайте учебник/MSDN о классах файлового ввода-вывода.
0
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
02.07.2018, 11:55  [ТС]
Еще вопросы, определился , что все складывать буду в очередь, так мне кажется будет удобнее, вот если у меня кусок считался в буфер, буфер емкостью 1024 байта,как понять что буфер полный и нужно забирать данные от туда?
Как я понимаю очередь по размеру всегда будет в 2 раза или в 4 раза больше чем буфер, значит там в один момент времени будет больше одного куска,вопрос,как забрать именно нужный кусок и затем очистить очередь именно от этого куска, как я понял очередь это может сделать сама методом Dequeue(),(я заберу кусок и очищу очередь от него ).
Далее я читаю из потока файл,прочитал первые 1024 байта, положил их в очередь,далее, сдвинул указать на 1204 байта, снова прочитал 1024 и так далее, или есть способ проще, чтобы разделать файл на куски.
Заранее спасибо за ответы.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
02.07.2018, 12:29
Мдфв1234,
ещё раз. Нет там никакой очереди.

Оформим огрызок в виде буфера - массив байт допустим размером 1 мегабайт. Отдельным числом можно запоминать, сколько в этом буфере реальных байт, если не до упора заполнен.
Из большого файла можно читать из FileStream порциями по 1 мегабайту.

C#
1
2
3
4
5
Read(
    byte[] array,
    int offset,
    int count
)
Параметры
array
Type: System.Byte[]
При возврате этот метод содержит указанный массив байтов, в котором значения в диапазоне от offset до (offset + count - 1)) заменены байтами, считанными из текущего источника.
offset
Type: System.Int32
Смещение в байтах в массиве array, в который будут помещены считанные байты.
count
Type: System.Int32
Максимальное число байтов, предназначенных для чтения.

Ну не сложно же в MSDN прочитать.
https://msdn.microsoft.com/ru-... .110).aspx
1
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
02.07.2018, 12:40  [ТС]
Спасибо , как раз вот этот момент и читаю.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
02.07.2018, 12:46
Мдфв1234, лист бумаги и авторучку так и не удалось вчера взять?
0
2 / 2 / 0
Регистрация: 05.12.2013
Сообщений: 271
02.07.2018, 12:50  [ТС]
да про ручку и бумагу, она со мной всегда.(покажите пример,как бы вы работали с ручкой и бумагой, буду признателен,) просто опыта маловато, теории много, а тут задача с заковыкой, и посложнее чем считать текстовый файл.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
02.07.2018, 13:09
Мдфв1234, Например, большой файл - отрезок от 0 до 100.
В компьютер влезает 20.
Можно отметить границы и числа.

Очень сложная задача - сколько раз число 20 помещается в числе 100. На листе бумаги это видно наглядно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.07.2018, 13:09
Помогаю со студенческими работами здесь

Копирование файла по фиксированным частям
#include &lt;stdio.h&gt; FILE *f,*fr; int nsize=64; //byte int posled(void); int main(int argc, char *argv) { ...

Просмотр типизированного файла по частям
реализовал просмотр файла. если записей больше 20, то очищаем экран и выводит еще 20 записей. минус - по базе двигаемся только вперед....

При загрузке файла по частям сервер фиксирует ошибку UPLOAD_ERR_PARTIAL
Загружаю файл на сервер через сокет вызывая send. Сокет в неблокирующем режиме. Если передаю send сразу весь файл загрузка успешна. Для...

Как сигнатура узнает какие байты РЕ файла соответствуют ее частям?
КАК сигнатура узнает какие байты РЕ файла соотвецтвуют ее частям? К примеру, я хочу начать разбор файла. Отсчитывать байты равными...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, &quot;ing&quot;) в текстовом документе. в прикреплённом коде текст вводится прямо в консоль,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru