Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
.NET 4.x

Добавить и удалить массив байтов к файлу большого размера

16.11.2022, 00:57. Показов 532. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Как можно быстро добавлять и удалять массив байтов к файлу. Или в начало или в конец. Без разницы. Просто записать стороннюю инфу в бинарный файл нужно и потом её читать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.11.2022, 00:57
Ответы с готовыми решениями:

Как искать последовательность байтов в файлах большого размера
Как искать последовательность байтов в файлах большого размера? (может достигать несколько гигабайт) Нужны позиции всех совпадений.

Произвольный доступ к файлу большого размера 4+гб
Предыстория. Поверхностно изучил файлы и пошел дальше, потом решил вернуться и изучить все глубоко. Все в голове поломалось, когда я понял,...

Файл или массив большого размера вывести на экран через буфер маленького размера
Приветствую! Суть: нужно продеть слона int slon длиной 13467 через игольное ушко byte uho = new byte, чтобы часть слона, прошедшая через...

9
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18304 / 14228 / 5368
Регистрация: 17.03.2014
Сообщений: 28,901
Записей в блоге: 1
16.11.2022, 01:04
Alexandr_7, в конец файла без проблем - открываете файл на запись в режиме Append и пишите. В начало файла быстро не получится. Кучу данных так или иначе придется двигать.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
16.11.2022, 01:28  [ТС]
Не особо понял. Файл бинарный. Мне мало того что записать нужно мне ещё нужно аотом прочитать и удалить записанные наборы байтов чтобы файл стал рабочим.

Добавлено через 21 минуту
Ну к примеру как записать я разобрался.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static bool SevenZipToAL7Pack(TypeAL7Pack typeAL7Pack, string filename)
        {
            if (!File.Exists(filename)) return false;
 
            try
            {
                byte[] writedBytes = new byte[5] { 255, (byte)typeAL7Pack, 0, 0, 0 };
                var filenameAL7Pack = Path.Combine(Path.GetDirectoryName(filename), $"{Path.GetFileNameWithoutExtension(filename)}.al7pack");
                File.Copy(filename, filenameAL7Pack);
 
                using (var fs = File.Open(filenameAL7Pack, FileMode.Append))
                {
                    fs.Write(writedBytes, 0, 5);
                    fs.Flush();
                }
                return true;
            }
            catch
            {
                return false;
            }
        }
А как прочитать и что более важно удалить их
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16141 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,126
Записей в блоге: 2
16.11.2022, 01:41
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
А как прочитать и что более важно удалить их
Для этого нужно запоминать позицию.
Как вариант можно подсчитать длину дописанных данных и записать int в конец файла.
При чтении сначала прочитать int в конце файла.
Потом сместиться вперёд на эту длину и прочитать все данные.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
16.11.2022, 01:52  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Для этого нужно запоминать позицию.
Как вариант можно подсчитать длину дописанных данных и записать int в конец файла.
При чтении сначала прочитать int в конце файла.
Потом сместиться вперёд на эту длину и прочитать все данные.
Позицию можно и высчитать отняв 5 байтов так как как я записываю массив изх длинны 5ти байтов
Вот что я сам поэксперементировал
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        public static byte[] AL7PackToSevenZip(string filename)
        {
            if (!File.Exists(filename)) return null;
 
            try
            {
                byte[] readedBuffer = new byte[5];
 
                var filenameSevenZip = Path.Combine(Path.GetDirectoryName(filename), $"{Path.GetFileNameWithoutExtension(filename)}.2.7z");
 
                using (var fs = File.Open(filename, FileMode.Open))
                {
                    fs.Position = fs.Length - 5;
                    fs.Read(readedBuffer, 0, 5);
                }
                File.WriteAllBytes(filenameSevenZip, new BinaryReader(File.Open(filename, FileMode.Open)).ReadBytes((int)new FileInfo(filename).Length-5));
                return readedBuffer;
            }
            catch
            {
                return null;
            }
        }
Вроде как вариант рабочий но не особо мне нравится хотябы тем что приходится конвертить long в int и может быть ошибка если файл очень громадный.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16141 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,126
Записей в блоге: 2
16.11.2022, 02:22
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Позицию можно и высчитать отняв 5 байтов так как как я записываю массив изх длинны 5ти байтов
Если размер данных постоянен, конечно, можно сразу сместится в нужную позицию.

Добавлено через 5 минут
Для смещения в позицию с конца используйте fs.Seek(-5, SeekOrigin.End);

Добавлено через 55 секунд
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
не особо мне нравится хотябы тем что приходится конвертить long в int
Не вижу где у вас эта конвертация.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
16.11.2022, 18:46  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Не вижу где у вас эта конвертация.
File.WriteAllBytes(filenameSevenZip, new BinaryReader(File.Open(filename, FileMode.Open)).ReadBytes((int)new FileInfo(filename).Length-5));
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16141 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,126
Записей в блоге: 2
16.11.2022, 19:10
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
ReadBytes((int)new FileInfo(filename).Length-5));
Но это же считывание в буфер.
Буфер размером в 2 Гига - это максимум что может предоставить .Net.
Если файл больше, то нужно читать его кусками.
По факту даже 2 Гига это слишком много. Под буфер нужен непрерывный участок в памяти. А такого размера непрерывный участок - это проблематично для ОС.
Поэтому читать данные порциями больше чем 100к-1м лучше не стоит.

Добавлено через 4 минуты
Alexandr_7, если правильно понял, то вы туту читаете весь файл и записываете прочитанное кроме последних 5 байт.
Сделайте просто копию файла и отрежьте в ней последние 5 байт.
Это же намного проще.
0
 Аватар для Alexandr_7
87 / 22 / 6
Регистрация: 29.12.2015
Сообщений: 1,898
16.11.2022, 19:14  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Но это же считывание в буфер.
Буфер размером в 2 Гига - это максимум что может предоставить .Net.
Если файл больше, то нужно читать его кусками.
По факту даже 2 Гига это слишком много. Под буфер нужен непрерывный участок в памяти. А такого размера непрерывный участок - это проблематично для ОС.
Поэтому читать данные порциями больше чем 100к-1м лучше не стоит.
Ну как минимум код записи 5ти байтов информации должен работать и для больших файлов. Так вот мне нужно код удаления этих 5 байтов какбы конвертация обратно в чистый архив для дальнейшей его распаковки.

Добавлено через 1 минуту
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Alexandr_7, если правильно понял, то вы туту читаете весь файл и записываете прочитанное кроме последних 5 байт.
Сделайте просто копию файла и отрежьте в ней последние 5 байт.
Это же намного проще.
Да если бы я знал как. Точно не через File.Copy так как он не позволяет делать обрезку файла.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16141 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,126
Записей в блоге: 2
16.11.2022, 19:33
Alexandr_7, я же написал уже - создайте копию методом File.Copy().
И потом в ней "обрежьте хвост".
Зачем всё загонять в память?

Добавлено через 50 секунд
Цитата Сообщение от Alexandr_7 Посмотреть сообщение
Точно не через File.Copy так как он не позволяет делать обрезку файла.
Обрезать нужно ПОСЛЕ создания копии, а не во время её создания.

Добавлено через 17 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
    string fileSource = "source.bin";
    string fileTarget = "target.bin";
 
    byte[] bytes = new byte[100];
    random.NextBytes(bytes);
    File.WriteAllBytes(fileSource, bytes);
 
    File.Copy(fileSource, fileTarget, true);
    using (var file = File.OpenWrite(fileTarget))
    {
        file.SetLength(file.Length-47);
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.11.2022, 19:33
Помогаю со студенческими работами здесь

Выделить память под массив размера 2^64 байтов
Требуется выделить память под массив размера 2^64 байтов. Как порекомендуете решать данную задачу?

Массив большого размера не заполняется
По заданию необходимо считать из файла значения массива и отсортировать слиянием (рекурсивный алгоритм). Количество элементов в массиве...

Статический массив большого размера
Здраствуйте, скорее всего данная проблема у многих есть, этот код вызывает ошибку на этапе исполнения #include <windows.h> ...

Массив очередей большого размера
Мне нужно создать массив, в котором каждый элемент будет очередью queue. Массив нужен большой - до 100 тыс. Делаю вот так: ...

Как создать массив большого размера
В программе будет использоваться массив большого размера. Оперативная память - 512 МБ Создаю массив: char lol; Выдает ошибку :...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru