Як я писав інсталятор

Почну з того, що переді мною стояло завдання написати "інсталятор" - для встановлення програми на комп'ютер. Його потрібно було написати за 3 дні. Витративши цілий день на пошук інформації. З'ясувалося, що інсталятор насправді розархівує програму на жорсткий диск комп'ютера. Став шукати алгоритми архівування і прийшов до думки, що я не встигну його написати бо майже нічого не зрозуміло, як створити один єдиний файл, що запускається. Довелося розробляти свою милицю. Які відомості необхідно знати інсталятору для перенесення файлів на жорсткий диск і при цьому знати успішно пройшла інсталяція чи ні? Я вирішив створювати 2 файли. Перший - це величезний файл, в кінець якого просто записується всі наступні файли для копіювання. Так само як би ми склеювали файли. А в другому повинна була зберігатися інформація про переліки файлів, їх шляхи, розмір і контрольну суму. І він виглядав так: /RemServer.class 3779 2103997792

/COPYRING 18007 3864095514

/Lang/russian.properties 1885 4029478516

Де - замінювався на шлях установки Block - розмір файлу Crc - контрольна сума, для перевірки, файлу після вилучення

Тепер залишалося написати мордочку установки. Час спливав. Тому що простіше, то краще. Кожна «сторінка» інсталяції – це окремий виклик методу, в якому вже створюються текстові поля, кнопки та мітки. При натисканні на кнопку назад/далі ми викликали попередній/наступний метод, який знищував усі компоненти даного методу та створював свої.

З тією умовою, що спочатку використовувався формат xml і його доводилося відразу весь парсити. Він нам давав: кількість файлів, для прогрес-бару (кількість врахованих блоків*100/кількість блоків_з_xml_файлу), після того, як файл був перенесений на жорсткийдиск здійснювалася перевірка контрольної суми. Якщо вона не збігалася, установка припинялася через помилку копіювання файлу, що повідомлялося користувачеві.

Завдання стояло, щоб інсталятор був одним файлом. Як очевидно, у мене це не вийшло. Я спочатку писав на java, тому всі файли інсталятора, а так само 2-архівні файли були засунуті в один jar-архів.

Не обійшлось і без підводного каменю. Файлів для розпакування було

1500. Наближаючись при розпакуванні до 1000, з'являлася помилка про неможливість відкриття ще одного файлу, оскільки ліміт відкритих файлів вичерпаний. FileOutputStream to = New FileOutputStream("" + arhive.getNameFile()); //записуємо блоки, перевіряємо файл to.close(); to = null;

Як рішення довелося створювати потік: Runnable inputReaderRunnable = new Runnable() public void run() try //працюємо зі склеєним файлом FileOutputStream to = new FileOutputStream("" + arhive.getNameFile()); //записуємо блоки, перевіряємо файл to.close(); to = null; Thread.sleep(200); // Затримка, даємо збирачеві сміття час для очищення //Після вилучення всіх файлів throw new InterruptedException(); //Зупиняємо потік > catch (InterruptedException e) < //Відведений час виконання програми минув getMenuFinall(); //фінальне меню, що говорить про успіх чи ні в устаноці Thread.currentThread().interrupt(); // Перериваємо потік > catch (Exception ex) < > > >; Thread inputReaderThread = New Thread(inputReaderRunnable); inputReaderThread.start();

Хардкорна конфа за С++. Ми запрошуємо лише профі.

Написав гарний текст – отримав запрошення.

У «Пісочниці» діє премодерація: перед публікацією всі матеріали проходять через дбайливе проміння.НЛО.

З великою ймовірністю не пройдуть премодерацію: