1

Тема: Запаковка файлiв в один

Ось є декiлька папок, *.exe, *.txt.
Як запакувати це все в один файл з розширенням .fils ?
Розширення fils я сказав для прикладу.
PS: Пiдкажiть хоч в якому напрямку копати.

2

Re: Запаковка файлiв в один

Напрямок зветься "файлові системи". Диск на низькому рівні є просто набором байтів, так само, як і файл; цей факт використовується в *NIX-системах, де можна змонтувати будь-який файл так, ніби це окремий диск. Вам треба створити файлову систему всередині файлу.

Подякували: leofun011

3 Востаннє редагувалося P.Y. (02.10.2015 12:55:54)

Re: Запаковка файлiв в один

Іншими словами, треба написати свій архіватор, щоб згенеровані ним архіви можна було потім розпакувати з допомогою свого деархіватора?

Очевидно, згенерований архів повинен містити інформацію про кожен файл (ім'я з відносним шляхом та розмір — необхідний мінімум, плюс час створення та інші метадані) і самі дані файла, скопійовані побайтно.

В найпростішому випадку, блок метаданих (ім'я, розмір і т.д.) може йти безпосередньо перед вмістом файла, зразу після них — метадані і вміст наступного файла, і т.д. Або ж архів може містити всі метадані в одному місці, а вміст файлів — десь окремо після них, тоді метадані повинні включати в себе також зміщення (тобто, номер байта від початку архіва, з якого починається вміст файла). Перший варіант простіше реалізувати (просто дописуємо в кінець архіву метадані та вміст кожного файла), але він менш ефективний, якщо нам треба не розпаковувати архів повністю, а просто вийняти окремий файл.

Блоки метаданих можуть являти собою структуру фіксованого розміру, або ж це може бути текстовий рядок невизначеної довжини, обмежений певним символом (тобто байтом чи послідовністю з кількох байтів), або ж це може бути якась складніша структура — варіантів безліч. Вміст файлів — це просто дані з файлу, скопійовані в архів побайтно (ну або їх можна стискати, але це вже окрема тема...).

Все сказане вище — загальні поради, не прив'язані до конкретної мови чи конкретного формату архівів. Очевидно, для реалізації цього потрібен набір засобів для читання/запису блоків байтів безпосередньо з/до файлу. У випадку C#, System.IO.FileStream забезпечує потрібний функціонал. Крім того, потрібні засоби для перетворення послідовностей байтів з/в інші типи даних (у першу чергу, для зберігання даних про розмір та інших метаданих). Скажімо, всю допоміжну інформацію можна зібрати в рядок (String), перекодувати в байти й записати у файл, поставивши обмежувальний байт наприкінці (відповідно, при розпакуванні треба буде зчитати байти від поточної позиції у файлі до обмежувача, конвертувати їх у рядок, розпарсити його, щоб отримати інформацію про наступний заархівований файл...).

4

Re: Запаковка файлiв в один

Ну, якщо вже використовувати C#, то є Serialize, щоб в рядок перетворювати.