Тема: Запаковка файлiв в один
Ось є декiлька папок, *.exe, *.txt.
Як запакувати це все в один файл з розширенням .fils ?
Розширення fils я сказав для прикладу.
PS: Пiдкажiть хоч в якому напрямку копати.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C#, .NET → Запаковка файлiв в один
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Ось є декiлька папок, *.exe, *.txt.
Як запакувати це все в один файл з розширенням .fils ?
Розширення fils я сказав для прикладу.
PS: Пiдкажiть хоч в якому напрямку копати.
Напрямок зветься "файлові системи". Диск на низькому рівні є просто набором байтів, так само, як і файл; цей факт використовується в *NIX-системах, де можна змонтувати будь-який файл так, ніби це окремий диск. Вам треба створити файлову систему всередині файлу.
Іншими словами, треба написати свій архіватор, щоб згенеровані ним архіви можна було потім розпакувати з допомогою свого деархіватора?
Очевидно, згенерований архів повинен містити інформацію про кожен файл (ім'я з відносним шляхом та розмір — необхідний мінімум, плюс час створення та інші метадані) і самі дані файла, скопійовані побайтно.
В найпростішому випадку, блок метаданих (ім'я, розмір і т.д.) може йти безпосередньо перед вмістом файла, зразу після них — метадані і вміст наступного файла, і т.д. Або ж архів може містити всі метадані в одному місці, а вміст файлів — десь окремо після них, тоді метадані повинні включати в себе також зміщення (тобто, номер байта від початку архіва, з якого починається вміст файла). Перший варіант простіше реалізувати (просто дописуємо в кінець архіву метадані та вміст кожного файла), але він менш ефективний, якщо нам треба не розпаковувати архів повністю, а просто вийняти окремий файл.
Блоки метаданих можуть являти собою структуру фіксованого розміру, або ж це може бути текстовий рядок невизначеної довжини, обмежений певним символом (тобто байтом чи послідовністю з кількох байтів), або ж це може бути якась складніша структура — варіантів безліч. Вміст файлів — це просто дані з файлу, скопійовані в архів побайтно (ну або їх можна стискати, але це вже окрема тема...).
Все сказане вище — загальні поради, не прив'язані до конкретної мови чи конкретного формату архівів. Очевидно, для реалізації цього потрібен набір засобів для читання/запису блоків байтів безпосередньо з/до файлу. У випадку C#, System.IO.FileStream забезпечує потрібний функціонал. Крім того, потрібні засоби для перетворення послідовностей байтів з/в інші типи даних (у першу чергу, для зберігання даних про розмір та інших метаданих). Скажімо, всю допоміжну інформацію можна зібрати в рядок (String), перекодувати в байти й записати у файл, поставивши обмежувальний байт наприкінці (відповідно, при розпакуванні треба буде зчитати байти від поточної позиції у файлі до обмежувача, конвертувати їх у рядок, розпарсити його, щоб отримати інформацію про наступний заархівований файл...).
Ну, якщо вже використовувати C#, то є Serialize, щоб в рядок перетворювати.
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися