Програма для синхронізації файлів і папок між двома пристроями

Розробка програми для синхронізації та резервного копіювання даних на основі функцій Windows API. Методи отримання шляхів папок. Синхронізація та резервне копіювання файлів або папок. Застосування основ мови програмування С, функцій Windows API.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 21.05.2019
Размер файла 366,5 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

ВСТУП

Важливим кроком в розвитку програмування з'явилося створення і широке розповсюдження мови С. С - це мова програмування загального призначення, добре відома своєю ефективністю, економічністю, і переносністю. Мова програмування С забезпечує хорошу якість розробки майже будь-якого виду програмного продукту. С забезпечує повний набір операторів структурного програмування. Невідмінною частиною створення Windows додатків є використання функцій Windows API, які забезпечують взаємодію створених застосунків з операційною системою.

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

С -- мінімалістична мова програмування. Серед її головних цілей: можливість прямолінійної реалізації компіляції, використовуючи відносно простий компілятор, забезпечити низькорівневий доступ до оперативної пам'яті, формувати лише декілька інструкцій машинної мови для кожного елементу мови, і не вимагати обширної динамічної підтримки. У результаті, код С придатний для більшості системного програмного забезпечення, яке традиційно писалося асемблером.

Незважаючи на її низькорівневі можливості, мова проектувалася для машинно-незалежного програмування. Сумісна зі стандартами та машинно-незалежно написана мовою C програма, може легко компілюватися на великій кількості апаратних платформ та операційних систем з мінімальними змінами. Мова стала доступною для великої кількості платформ, від вбудованих мікроконтролерів до суперкомп'ютерів.

1. АНАЛІЗ ТЕХНІЧНОГО ЗАВДАННЯ

1.1 Найменування та область застосування

Метою курсової роботи поставлено завдання розробити програму для для синхронізації файлів і папок між двома пристроями, дисками, папками з можливістю вибору синхронізації файлів чи папок.

Програма не повинна вимагати від користувача виконання складних дій. Графічний інтерфейс повинен бути максимально простим та зручним.

1.2 Призначення розробки

Ціль даної програми - дозволити користувачу швидко та легко проводити резервне копіювання та синхронізацію файлів.

У курсовому проекті буде розроблено програму, яка надасть можливість користувачу проводити резервне копіювання та синхронізацію файлів.

Інтерфейс та функції програми забезпечуватимуть зрозумілу роботу користувача.

1.3 Вимоги до програмного забезпечення

В програмі потрібно реалізувати наступні функції:

- вибір двох папок;

- можливість копіювання файлів;

- можливість копіювання папок;

З метою подальшого вдосконалення програмного продукту, а також забезпечення зрозумілості програмного коду, програмний продукт повинен бути написаний на мові програмування C, з використанням функцій Windows Api, чітко до правил програмування даної мови.

Вхідні дані

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

Вихідна інформація

Вихідною інформацією програми є синхронізовані чи резервно скопійовані файли.

Опис функцій та обмежень

Програма повинна синхронізовувати файли та папки. Повинен бути вибір папок та файлів по двох папках. Розмір файлів для синхронізації чи резервного копіювання обмежений вільним простором на диску.

Часові характеристики

Часові характеристики визначаються швидкістю роботи вінчестера чи пристрою.

Вимоги до надійності

З метою забезпечення надійного функціонування програми повинні бути передбаченні наступні критерії:

- обробка збійних ситуацій;

- ієрархічна структура комплексу програми;

- контроль вводу даних, який забезпечує стійкість програми до помилок вводу користувача.

Умови експлуатації

Програма повинна бути запущена на комп'ютері під управлінням операційної системи Microsoft Windows Vista і вище.

Мінімальні характеристики апаратного забезпечення, яке забезпечить ефективну роботу програми на базі операційної системи Windows Vista повинні бути:

- 800 МГц 32-розрядний (x86)

- оперативна пам'ять - 512 Mбайт;

- Відеоадаптер: Super VGA (800 x 600);

- графічної пам'яті - 32 МБ;

- обсяг дискової пам'яті для програми - 553 КБайт;

- мишка та клавіатура.

Вимоги до програмної документації

Закінчивши розробку програмного комплексу підготовлено таку документацію:

ѕ Інструкція по створенню інсталяційного пакету;

ѕ Інструкція з установки даного програмного забезпечення;

ѕ Опис основних технічних вимог.

Вся документація укладена в зрозумілому вигляді потрібному для простої та коректної взаємодії користувача з програмним продуктом.

Стадії та етапи розробки

Даний проект буде мати такі стадії розробки:

- загальне проектування вимог до функцій програми;

- проектування та створення блок-схем, необхідних для подальшої розробки;

- розробка в середовищі програмування CodeBlocks MinGW тексту програми;

- тестування та налагодження роботи;

- створення інструкції з експлуатації.

2. РОЗРОБКА ТЕХНІЧНОГО ПРОЕКТУ

2.1 Постановка задачі на розробку програмного забезпечення

Метою курсової роботи поставлено завдання розробити програму для для синхронізації файлів і папок між двома пристроями, дисками, папками з можливістю вибору синхронізації файлів чи папок. Програма буде написана на мові С, з икористанням функцій Windows API. C -це мова програмування загального призначення, що включає економiю представлення, сучасне керування потоком i структурою даних i багатий набiр операторiв. C не є мовою "дуже високого рiвня", нi "великою" мовою, i не призначена для певної областi застосування. Але вiдсутнiсть в нiй обмежень та її загальнiсть роблять її зручнiшою i ефективнiшою для багатьох завдань, у порiвняннi з мовами, що вважаються потужнiшими.Версії компіляторів для мови Сіснують для багатьох операційних систем та апаратних архітектур. С здійснила великий вплив на інші мови програмування, особливо на C++, яка спочатку проектувалася, як розширення для С, а також на Java та C#, які запозичили у С синтаксис.

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

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

Windows API (application programming interfaces) - загальне найменування для цілого набору базових функцій інтерфейсів програмування операційних систем сімейств Windows корпорації Майкрософт. Є найпрямішим способом взаємодії з Windows. Windows API був спочатку спроектований для використання в програмах, написаних на мові C (або C++). Робота через Windows API - це найближчий до системи спосіб взаємодії з нею прикладних програм.

Опис та обгрунтування вибору структури та методу організації вхідних та вихідних даних.

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

2.2 Опис методів реалізації функцій програми

Спочатку програма перевіряє чи існують шляхи, які вказав користувач. Якщо шляхи існують то програма перевіряє що саме користувач вибрав для синхронізації чи резервного копіювання.

Резервне копіювання копіює усі файли або папки і файли з шляху 1 в шлях 2. Синхронізація проводить копіювання усіх файлів або папок і файлів з шляху 1 в шлях 2 і з шляху 2 в шлях 1.

Якщо вибрано копіювання папок то програма перевіряє чи існує папка, якщо ні то створює її а тоді виконується рекурсивно, додаючи до обох своїх шляхів папу в якій повинна виконатись.

Курсова робота реалізована за допомогою мови програмування С, стандартних функцій операційної системи Windows, бібліотек функцій MinGW а також підпрограм написаних програмістом. Все це в сукупності складає програмну реалізацію програмної системи. Докладніше про стандартні функції Windows:

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) - функції WinMain повинна виконати наступні дії: Зареєструвати клас вікна програми (можливо і інші класи), тут же вказується, яка функція буде обробляти повідомлення цього вікна. Створити головне вікно, на основі створеного класу і відобразити його на екрані (і інші, підлеглі вікна). Запустити цикл обробки повідомлень. Поки не отримано повідомлення WM_QUIT, відправляти повідомлення на обробку в функцію вікна. За повідомленням WM_QUIT завершити роботу додатка.

RESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM) - віконна процедура (функція вікна). ОС Windows сама викликає її при обробці повідомлень, призначених для даного вікна. Всі повідомлення передаються в функцію вікна, але не на всі повідомлення ми зобов'язані реагувати. Якщо в додатку планується обробляти конкретне повідомлення, то воно включається в оператор switch. Решта повідомлення обробляються за замовчуванням. Для цього їх пересилають на обробку в функцію DefWindowProc. Тільки одне повідомлення ми завжди зобов'язані перехоплювати. Це WM_DESTROY, що посилається самій Windows у той момент, коли користувач закриває вікно (натискаючи кнопку закриття в заголовку вікна). Стандартний відповідь на WM_DESTROY полягає у виклику функції PostQuitMessage (0). Це відповідає посилці повідомлення про вихід з програми зі значенням нуля в якості коду повернення. В якості параметрів функції вікна будуть передаватися дескриптор поточного вікна, код повідомлення і його параметри (wParam і lParam) ми цю функції не викликаєм. Вся функція вікна в простому випадку це оператор switch, який аналізує ідентифікатор повідомлень (змінна message), наприклад:

switch (message)

{

case WM_CREATE:

/* код створення вікон */

case WM_COMMAND:

/* код опрацювання команд кнопок */

case WM_DESTROY:

PostQuitMessage (0);

break;

default: return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}

CreateWindow(ExStyle: Longint; ClassName, WindowName: PChar; Style: Longint; X, Y, Width, Height: Integer; WndParent: HWnd; Menu: HMenu; Instance: THandle; Param: Pointer): HWnd - створює пеpекрите, спливаюче або дочіpнє вікно з розширеним стилем.

std::string BrowseFolder(std::string saved_path, LPCSTR foldernumber) - виводить стандартне вікно ОС Windows для вибору каталогу, шлях каталогу зберыгаэ у змінну path.

static int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) - забезпечує зв'язок між головним вікном програми та стандартним вікном ОС Windows для вибору каталогу.

bool isDir(LPCTSTR path) - перевіряє чи є об'єкт папкою.

void copyall(LPCTSTR oldPath, LPCTSTR newPath, bool files, bool folders) - копіює усі об'єкти з шляху один в шлях 2 якщо порібно. Виконується перевірка двох логічних змінних bool files і bool folders і в залежності від цього копіюються файли чи файли та папки.

2.3 Визначення інформаційних зв'язків

На основному вікні знаходяться текст-бокси в які користувач може ввести шляхи папок. Також він може клацнути на кнопку вказати папку і функція BrowseFolder за допомогою функції BrowseCallbackProc виведе стандартне вікно вибору шляху де потрібно вибрати папку, її шлях збережеться в змінну а також запишеться в текст-бокси функцією SetWindowText. Далі потрібно вибрати чек-бокси вибору копіювання файлва та папок. Чекбокси обробляються функціями CheckDlgButton і IsDlgButtonChecked. Далі при натисканні кнопки Копіювати спрацьовує функція GetWindowText, отримує шляхи папок з текст боксів і передає їх функції copyAll. Функція copyAll за допомогою функції isDir перевіряє чи є об'єкт папкою, далі копіює його якщо відмічений відповідний чек бокс. Якщо об'єкт є папкою то перевіряє чи існує одноіменна папка за шляхом 2 і якщо так то викликає себе ж з шляхами цих папок, якщо ні то за допомогою функції CreateDirectory створює папку а тоді викликає себе ж з шляхами цих папок.

Взаємозв'язки між змінними та функціями програми зображені на рисунку 2.1, створенному за допомогою програми Visual Studio ULTIMATE 2013.

Рисунок 2.1 - взаємозв'язки між змінними та функціями

Опис функцій наведений в таблиці 2.1

Таблиця 2.1 - Опис функцій

WinMain

Головна функція програми

WindowProc

Функція створення вікна

isDir

Функція перевірки чи є об'єкт папкою

Copyall

копіювання файлів і папок

BrowseCallbackProc

Функція для обробки повідомлень між вікнами

BrowseFolder

Функція для виведення вікна вибору папки

CreateWindowEx

Створення головного вікна

ShowWindow

Відображає головне вікно

GetWindowText

Отримання тексту з текстового поля в змінну

MessageBox

Виводить повідомлення про невірне вказання шляху папки

CheckDlgButton

Встановлює стан чекбокса

IsDlgButtonChecked

Перевіряє стан чекбокса

SetWindowText

Встановлює текст у текстовому полі

CopyFile

Копіює файл

CreateDirectory

Створює папку

2.4 Написання текстів програми

Для розробки програми була використана мова програмування С, а також функції Win32 API. У виготовлені програми дотримано всіх правил написання тексту програми та коментарів до них. Мова програмування С - це гнучка мова програмування з великими можливостями для програміста. Основні відомості та особливості даної мови програмування:

Мова С забезпечує різноманітність типів даних. Базовими типами є цілі, речові числа і символи (літери). Мова вирішує модифікацію базових типів даних, а також створення призначених для користувача типів. У мові використовуються стандартні типи даних int, char, float, double; застосовуються масиви, структури (записи), файли; є можливість конструювання черг, списків. Мова має в своєму розпорядженні інструкції, що управляють, дозволяють створювати добре структуровані програми:

- складена інструкція або блок {…}

- галуження по умові if - else

- вибір один з багатьох варіантів switch

- цикли з передумовою while, for

- цикл do…while цикл з післяумовою

- переривання і продовження циклу break,continue

Також в С є багато засобів, властивих іншим мовам програмування, зокрема:

- вбудовані засоби введення/виводу, методи доступу до файлів;

- засоби роботи з символьними рядками;

- засоби роботи із складеними об'єктами (масиви, структури).

Все це - механізми високого рівня, які в С реалізуються за допомогою явних функцій, що викликаються. Програма на С складається з програмних одиниць одного типу - функцій. Аргументи можуть передаватися функціям за допомогою копіювання значень цих аргументів. При цьому викликана функція не може змінити фактичний аргумент в зухвалій підпрограмі. Можливий інший варіант - передача параметра по вказівнику, коли явно передається покажчик, тобто адреса, при цьому функція зможе змінити об'єкт, на який посилається покажчик. У С передбачений ряд операцій низького рівня: прямий доступ до пам'яті, операції над бітами даних і адресної арифметики. Програми на мові С компактні і гнучкі. Мова C довіряє програмістові і дозволяє йому практично все. Через це C можна вважати мовою надійного програмування, проте, вся відповідальність за якість програми лежить на програмістові, який повинен знати особливості мови і її реалізації. Безліч символів, використовуваних в мові С, можна розділити на п'ять груп:

- символи, використовувані для запису ключових слів і ідентифікаторів, до яких відносяться прописні і рядкові букви англійського алфавіту і символ підкреслення ( _ ). Слід зазначити, що однакові прописні і рядкові букви вважаються різними символами, оскільки мають різні коди (A, а - різні символи). Компілятори мов C і C++ розпізнають прописні і рядкові букви;

- арабські цифри 0 … 9;

- роздільники:, . ; : ? '' " ! | / \ ~ * () {} [] <> + ? & # % = _ ., що використовуються, з одного боку, для організації процесу обчислень, а з іншої - для передачі компілятору певного набору інструкцій;

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

- Esc-символі (escape-символі, escape-послідовності або послідовності, що управляють), тобто послідовність символів, що починається з символу \ (зворотної похилої межі), використовувана для вистави в програмі коди одного символу, що як друкується, так і недрукованого (керівника).

Ідентифікатором називається ім'я якого-небудь об'єкту в програмі (змінній, функції і т. д.). Для утворення ідентифікаторів можуть бути використані рядкові або прописні букви латинського алфавіту, цифри і символ підкреслення ''_''. Першим символом в ідентифікаторі має бути буква. Допускається використання як перший символ знаку підкреслення ''_''. Важливою особливістю є те, що компілятор допускає будь-яка кількість символів в ідентифікаторі. Ідентифікатор створюється на етапі оголошення змінних, функції, структур і тому подібне Після цього його можна використовувати в подальших інструкціях програмі, що розробляється. Відзначимо ряд обмежень при виборі ідентифікатора. По-перше, ідентифікатор не повинен збігатися з ключовими і зарезервованими словами, іменами бібліотечних функцій. По-друге, слід звернути особливу увагу на використання символу підкреслення, як перший символ ідентифікатора. Ідентифікатори, побудовані таким чином, з одного боку, можуть збігатися з іменами системних функцій / змінних, а з іншого боку, при використанні таких ідентифікаторів програми можуть виявитися непереносними, тобто їх не можна буде використовувати на комп'ютерах інших типів, тому доцільно починати ідентифікатор з рядкової букви, наприклад: x1, a_prim і так далі.

Лексемою називається одиниця тексту програми, яка має певний сенс для компілятора і не може бути надалі розбита на складові частини. В мові C лексемами є знаки пунктуації, всі види дужок, знаки операцій, константи ідентифікатори, ключові слова. У ряді випадків лексеми можуть зрозуміти компілятором невірно, наприклад, x---y буде сприйняте як (x--) -(y), а не як (x) -(--y). Для виключення неоднозначності рекомендується використовувати дужки.

Коментар є деяким текстом пояснення і є послідовністю символів, ув'язнених в обмежувальну конструкцію /* і */. Символи можуть бути будь-які, включаючи символ нового рядка, але виключаючи */ (кінець коментаря). Коментарі можуть займати більш за один рядок, але не можуть бути вкладеними. Формат коментаря: /*-символ*/. Коментар сприймається компілятором як окремий пробільний символ і ігнорується ним. Коментарі допускаються скрізь, де дозволені пропуски. У C коментар може починатися значком //, а закінчуватися символом нового рядка.

Використання функцій Windows дещо ускладнює процес написання програм, тому що в програмі використовуються специфічні функції які описані в директиві препроцесора<windows.h>. Але при програмуванні під Windows ми можемо використати всі можливості операційної системи, а її можливості великі, програми стають ще більш цікавими і різноманітними як на системному так і прикладному рівні. Блок схема головної функції програми наведена в додатку А.

Функції програми розроблені і реалізовані даними можливостями програмування, алгоритм функцій програми розроблений з урахуванням всіх аспектів при розробці програм з графікою, передбачено багато подій при використані програми в експлуатації. Інтерфейс програми простий і зрозумілий для користувача з малими знаннями ІТ. Здійснено багато підказок при експлуатації для користувача.

Маючи всі необхідні компоненти створювався код програми (додаток Б).

Текст програми був написаний таким чином, щоб мінімізувати розміри програми та збільшити її швидкодію та продуктивність.

При написанні кожного блоку програми враховувались можливості виникнення помилок, для цього перед виконанням тих чи інших дій перевірялась умова доступності і правильності вхідних даних та результатів.

Після кожного етапу написання програми проводився тест на правильність виконання алгоритму дій.

3. ТЕСТУВАННЯ ТА НАЛАГОДЖЕННЯ ПРОГРАМИ

Тестування програмного продукту відбувалось на ПК такої конфігурації:

- процесор: IntelCorei3-2330M - 2.27 ГГц;

- оперативна пам'ять: 4096Mb;

- під управлінням операційної системи Windows 7.

Програма розроблена в середовищі програмування CodeBlocks, на мові програмування С з використанням стандартних функцій Windows та бібліотек фунцій MinGW.

Для запуску програми слід мати .exe файл, який знаходиться в кореневому каталозі.

Програма не потребує інсталяції для того, щоб її запустити потрібно скопіювати файли які входять в даний пакет із носія на якому знаходиться програм в папку на комп'ютері.

Після запуску програмного продукту на екрані монітору з'являється головне вікно програми (див. рис 3.1), на якому розміщені всі елементи управління.

Рисунок 3.1 - головне вікно програми

Для того, щоб вибрати шляхи папок необхідно вказати їх у рядках адрес папок або клацнути на кнопку для вказання відповідної папки. Таке вікно зображене на рисунку 3.2.

Рисунок 3.2 - вікно вибору папки

У вікні потрібно зайти в папку, з якої користувач хоче синхронізовувати файли і натиснути кнопку ОК. Для вибору режиму резервного копіювання потрібно вирати копіювання в одну з папок, для вибору синхронізації - копіювання з обох папок. Якщо потрібно копіювати файли чи папки, необхідно вибрати відповідний варіант, при цьому копіювати папки без файлів неможливо. Коли користувач відмітить потрібні параметри він повинен натиснути кнопку "Копіювати".

ВИСНОВКИ

синхронізація резервний копіювання програма

В курсовій роботі було успішно розроблено програму для синхронізації та резервного копіювання даних на основі функцій Windows API.

Розроблено отримання шляхів папок двома методами:

- введення шляху напряму;

- вибір шляху через стандартне вікно Windows.

Розроблено можливість синхронізації та резервного копіювання файлів або папок та файлів

Розроблена програма відповідає усім вимогам технічного завдання.

Під час виконання курсової роботи вивчено і практично застосовано основи мови програмування С, функції Windows API, бібліотеки функцій комплекту MinGW, а також багато інших функцій.

ПЕРЕЛІК ПОСИЛАНЬ

1. Марціяш Г.Я. Методичні вказівки до виконання курсової роботи з системного програмування. - Тернопіль.; ТК ТНТУ імені Івана Пулюя, 2012.

2. Дейтел Дж. Как программировать на С++. - СП.:БВХ-Петербург, 2005. - 1104с.

3. Брэдли Л. Джонс, Питер Эйткен. Освой самостоятельно С за 21 день. - М.: Вильямс, 2003. - 800с.

4. Культин Н. С/С++ в задачах и примерах. - СП.:БВХ-Петербург, 2005. - 282с.

5. Хепкеманс Д., Ли М. Программирование на С++. - Пер. с англ. - СПб: Символ-Плюс, 2002. - 416 с.

Web-сайти

1. www.bcbdev.com

2. http://stackoverflow.com

3. http://msdn.microsoft.com

4. http://www.intuit.ru

5. http://www.languagec.info/

6. http://progrex.narod.ru

7. http://valery-us4leh.narod.ru

8. http://www.doc.ic.ac.uk

ДОДАТОК

БЛОК - СХЕМА АЛГОРИТМУ РОБОТИ ФУНКЦІЇ COPYALL

ТЕКСТ ПРОГРАМИ

#ifdefined(UNICODE) && !defined(_UNICODE)

#define _UNICODE

#elifdefined(_UNICODE) && !defined(UNICODE)

#define UNICODE

#endif

/*

* Курсовий проект з програмування

* Синхронізатор файлів Win32 API

* . ОКС-40х

* 2016

*/

// підключення бібліотек

#include<stdio.h>// для дебагу

#include<tchar.h>

#include<windows.h>

#include<iostream>

#include<string.h>

#include<dirent.h>

#include<shlobj.h>

#include<sstream>

//прототипи функцій

bool isDir(LPCTSTR path);

void copyall(LPCTSTR oldPath, LPCTSTR newPath, bool files, bool folders);

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

staticint CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg, LPARAM lParam, LPARAM lpData);

std::string BrowseFolder(std::string saved_path, LPCSTR foldernumber);

//оголошення змінних

HWND hwnd;

HWND TextBox;

HWND TextBox1;

HWND ButtonSync;

HWND ButtonPath1;

HWND ButtonPath2;

HWND foldersFrom1Check;

HWND foldersFrom2Check;

HWND filesFrom1Check;

HWND filesFrom2Check;

LPSTR path1;

LPSTR path2;

std::string path11;

std::string path22;

bool foldersFrom1 = false;

bool foldersFrom2 = false;

bool foldersCopyFrom1 = false;

bool foldersCopyFrom2 = false;

bool filesFrom1 = false;

bool filesFrom2 = false;

bool filesCopyFrom1 = false;

bool filesCopyFrom2 = false;

TCHAR szClassName[ ] = _T("CodeBlocksWindowsApp");

//головна фунція

int WINAPI WinMain (HINSTANCE hThisInstance,

HINSTANCE hPrevInstance,

LPSTR lpszArgument,

int nCmdShow)

{

HWND hwnd; /* This is the handle for our window */

MSG messages; /* Here messages to the application are saved */

WNDCLASSEX wincl; /* Data structure for the windowclass */

/* The Window structure */

wincl.hInstance = hThisInstance;

wincl.lpszClassName = szClassName;

wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */

wincl.style = CS_DBLCLKS; /* Catch double-clicks */

wincl.cbSize = sizeof (WNDCLASSEX);

/* Use default icon and mouse-pointer */

wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);

wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

wincl.hCursor = LoadCursor (NULL, IDC_ARROW);

wincl.lpszMenuName = NULL; /* No menu */

wincl.cbClsExtra = 0; /* No extra bytes after the window class */

wincl.cbWndExtra = 0; /* structure or the window instance */

/* Use Windows's default colour as the background of the window */

wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

/* Register the window class, and if it fails quit the program */

if (!RegisterClassEx (&wincl))

return 0;

/* The class is registered, let's create the program*/

hwnd = CreateWindowEx (

0, /* Extended possibilites for variation */

szClassName, /* Classname */

_T("File synchronizer by Volodymyr Fil"), /* Title Text */

WS_SYSMENU | WS_MINIMIZEBOX,

/*стилі вікна MINIMIZEBOX для можливості згортання,SYSMENU для неможливості ресайзу */

CW_USEDEFAULT, /* Windows decides the position */

CW_USEDEFAULT, /* where the window ends up on the screen */

550, /* The programs width */

350, /* and height in pixels */

HWND_DESKTOP, /* The window is a child-window to desktop */

NULL, /* No menu */

hThisInstance, /* Program Instance handler */

NULL /* No Window Creation data */

);

/* Make the window visible on the screen */

ShowWindow (hwnd, nCmdShow);

/* Run the message loop. It will run until GetMessage() returns 0 */

while (GetMessage (&messages, NULL, 0, 0))

{

/* Translate virtual-key messages into character messages */

TranslateMessage(&messages);

/* Send message to WindowProcedure */

/*printf("\n%s\t%s\t%s\t%s", foldersCopyFrom1 ? "true" : "false",

foldersCopyFrom2 ? "true" : "false", filesCopyFrom1 ? "true" : "false",

filesCopyFrom2 ? "true" : "false");*/ //для дебагу чекбоксів

DispatchMessage(&messages);

}

/* The program return-value is 0 - The value that PostQuitMessage() gave */

return messages.wParam;

}

/* This function is called by the Windows function DispatchMessage() */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

switch (message) /* handle the messages */

{

case WM_CREATE:

//створюємо текстбокси для шляху

TextBox = CreateWindow("EDIT", "шлях до папки 1 у форматі Диск:\\папка1\\",

WS_VISIBLE | WS_CHILD,

20, 30, 510, 20,

hwnd, NULL, NULL, NULL);

TextBox1 = CreateWindow("EDIT", "шлях до папки 2 у форматі Диск:\\папка2\\",

WS_VISIBLE | WS_CHILD,

20, 60, 510, 20, hwnd,

NULL, NULL, NULL);

// ствоюємо чекбокси для отримання булевих змінних

foldersFrom1Check = CreateWindow("BUTTON", "Копіювати папки з папки 1",

WS_VISIBLE | WS_CHILD | BS_CHECKBOX,

310, 144, 200, 12,

hwnd, (HMENU)2, NULL, NULL);

foldersFrom2Check = CreateWindow("BUTTON", "Копіювати папки з папки 2",

WS_VISIBLE | WS_CHILD | BS_CHECKBOX,

310, 174, 200, 12,

hwnd, (HMENU)3, NULL, NULL);

filesFrom1Check = CreateWindow("BUTTON", "Копіювати файли з папки 1",

WS_VISIBLE | WS_CHILD | BS_CHECKBOX,

60, 144, 205, 12,

hwnd, (HMENU)4, NULL, NULL);

filesFrom2Check = CreateWindow("BUTTON", "Копіювати файли з папки 2",

WS_VISIBLE | WS_CHILD | BS_CHECKBOX,

60, 174, 205, 12,

hwnd, (HMENU)5, NULL, NULL);

// створюємо кнопки

ButtonSync = CreateWindow("BUTTON", "Копіювати", WS_VISIBLE | WS_CHILD | WS_BORDER,

230, 230, 90, 20, hwnd, (HMENU) 1, NULL, NULL);

ButtonPath1 = CreateWindow("BUTTON", "Вказати папку 1", WS_VISIBLE | WS_CHILD | WS_BORDER,

90, 103, 160, 20, hwnd, (HMENU) 6, NULL, NULL);

ButtonPath2 = CreateWindow("BUTTON", "Вказати папку 2", WS_VISIBLE | WS_CHILD | WS_BORDER,

330, 103, 160, 20, hwnd, (HMENU) 7, NULL, NULL);

// блок обробки команд

case WM_COMMAND:

switch(LOWORD(wParam))

{

case 1:

{

// перевіряємо чи правильно вказаний шлях і якщо так проводимо копіювання

int gwtstat1 = 0;

gwtstat1 = GetWindowText(TextBox, path1, 255);

printf("%s\n", path1);

if (!isDir(path1)){MessageBox(hwnd, "Невірний шлях папки 1",

"Incorrect folder path", MB_OK);}

int gwtstat2 = 0;

gwtstat2 = GetWindowText(TextBox1, path2, 255);

if (!isDir(path2)){MessageBox(hwnd, "Невірний шлях папки 2",

"Incorrect folder path", MB_OK);}

printf("\n%s\n", path2);

copyall(path1, path2, filesCopyFrom1, foldersCopyFrom1);

copyall(path2, path1, filesCopyFrom2, foldersCopyFrom2);

break;

}

case 2:

{

//обробляємо натиск на чекбокси

foldersFrom1 = IsDlgButtonChecked(hwnd, 2);

if (foldersFrom1)

{

CheckDlgButton(hwnd, 2, BST_UNCHECKED);

foldersCopyFrom1 = false;

}

else

{

CheckDlgButton(hwnd, 2, BST_CHECKED);

CheckDlgButton(hwnd, 4, BST_CHECKED);

foldersCopyFrom1 = true;

}

break;

}

case 3:

{

foldersFrom2 = IsDlgButtonChecked(hwnd, 3);

if (foldersFrom2)

{

CheckDlgButton(hwnd, 3, BST_UNCHECKED);

foldersCopyFrom2 = false;

filesCopyFrom1 = true;

}

else

{

CheckDlgButton(hwnd, 3, BST_CHECKED);

CheckDlgButton(hwnd, 5, BST_CHECKED);

filesCopyFrom2 = true;

foldersCopyFrom2 = true;

}

break;

}

case 4:

{

filesFrom1 = IsDlgButtonChecked(hwnd, 4);

if (filesFrom1)

{

CheckDlgButton(hwnd, 4, BST_UNCHECKED);

filesCopyFrom1 = false;

}

else

{

CheckDlgButton(hwnd, 4, BST_CHECKED);

filesCopyFrom1 = true;

}

break;

}

case 5:

{

filesFrom2 = IsDlgButtonChecked(hwnd, 5);

if (filesFrom2)

{

CheckDlgButton(hwnd, 5, BST_UNCHECKED);

filesCopyFrom2 = false;

}

else

{

CheckDlgButton(hwnd, 5, BST_CHECKED);

filesCopyFrom2 = true;

}

break;

}

// обробляємо кнопки вибору папок

case 6:

path11 = BrowseFolder("\\", "Очікую на папку 1");

path11 = path11 + "\\";

std::cout << path11 << std::endl;

path1 = const_cast<char *>(path11.c_str());

SetWindowText(TextBox, path1);

break;

case 7:

path22 = BrowseFolder("\\", "Очікую на папку 2");

path22 = path22 + "\\";

std::cout << path22 << std::endl;

path2 = const_cast<char *>(path22.c_str());

SetWindowText(TextBox1, path2);

break;

}

break;

case WM_DESTROY:

PostQuitMessage (0); /* send a WM_QUIT to the message queue */

break;

default: /* for messages that we don't deal with */

return DefWindowProc (hwnd, message, wParam, lParam);

}

return 0;

}

// функція копіювання

void copyall(LPCTSTR oldPath, LPCTSTR newPath, bool files, bool folders)

{

DIR *dir;

struct dirent *ent;

if ((dir = opendir (oldPath)) != NULL)

{

// знаходимо усі файли та папки у вказаній папці

while ((ent = readdir (dir)) != NULL)

{

std::string h = ent->d_name;

std::string paththis = oldPath + h;

std::string pathother = newPath + h;

std::cout << paththis <<"\t"<< h << std::endl;

if (isDir(paththis.c_str()) == !true&& files == true)

{

//якщо це не папка і відмічене копіювання файлів - копіюємо

CopyFile(

paththis.c_str(),

pathother.c_str(),

false);

}

else

{

//якщо папка існує - синхронізовуємо вміст

if(isDir(pathother.c_str()) && h != "."&& h != ".."&& folders == true)

{

std::string newFolderPath = pathother + "\\";

std::string newSourcePath = paththis + "\\";

copyall(newSourcePath.c_str(), newFolderPath.c_str(), files, folders);

}

else

{

//якщо папка не існує створюємо

if(h != "."&& h != ".."&& folders == true)

{

std::cout<<"creating folder"<< pathother << std::endl;

CreateDirectory(pathother.c_str(), NULL);

std::string newFolderPath = pathother + "\\";

std::string newSourcePath = paththis + "\\";

copyall(newSourcePath.c_str(), newFolderPath.c_str(), files, folders);

}

}

}

}

closedir(dir);

}

}

//перевіряємо чи об'єкт є папкою

bool isDir(LPCTSTR path)

{

DIR *dir;

struct dirent *ent;

if ((dir = opendir (path)) != NULL)

{

closedir (dir);

returntrue;

}

else

{

returnfalse;

}

}

//функція зв'язку між вікном вибору папки та головним вікном

staticint CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,

LPARAM lParam, LPARAM lpData)

{

if(uMsg == BFFM_INITIALIZED)

{

std::string tmp = (constchar *) lpData;

std::cout <<"path: "<< tmp << std::endl;

SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);

}

return 0;

}

//функція вибору папки

std::string BrowseFolder(std::string saved_path, LPCSTR foldernumber)

{

TCHAR path[MAX_PATH];

constchar * path_param = saved_path.c_str();

BROWSEINFO bi = { 0 };

bi.lpszTitle = (foldernumber);

bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;

bi.lpfn = BrowseCallbackProc;

bi.lParam = (LPARAM) path_param;

LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );

if ( pidl != 0 )

{

SHGetPathFromIDList ( pidl, path );

IMalloc * imalloc = 0;

if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )

{

imalloc->Free ( pidl );

imalloc->Release ( );

}

return path;

}

return"";

}

Размещено на Allbest.ru


Подобные документы

  • Робочий стіл, панель інструментів, меню. Основні дії над об’єктами в ОС Windows. Створення папок та ярликів. Перейменування, переміщення, знищення та копіювання папок та файлів. Прийоми керування за допомогою миші. Запуск блокнота та його призначення.

    лабораторная работа [5,2 M], добавлен 15.10.2015

  • Методи роботи з операційною системою Windows: основні елементи інтерфейсу, механізми створення папки та ярлика. Призначення програми "Проводник". Алгоритм видалення, перейменування, копіювання файлів і папок. Критерії пошуку та структура вікна Windows.

    лабораторная работа [20,1 K], добавлен 13.12.2010

  • Інструменти середовища C++Builder, які були використані в програмі. Робота з файлами, їх відкриття, відображення та закриття. Розробка основних функцій для реалізації програми. Тестування програмного забезпечення. Блок-схема та алгоритм програми.

    курсовая работа [924,3 K], добавлен 14.01.2014

  • Особливості розвитку та загальна характеристика операційних систем сімейства Windows. Організація роботи в Windows, опис базових об'єктів (файлів, папок, додатків, документів) та набір дій з ними. Застосування Провідника для роботи з файлами та папками.

    курсовая работа [1,9 M], добавлен 20.12.2012

  • Копіювання або переміщення файлів через буфер обміну або за допомогою правої кнопки миші. Копіювання та переміщення файлів методом перетаскування. Пошукові мережеві системи. Організація пошуку інформації в мережі Iнтернет. Класифікація пошукових систем.

    контрольная работа [855,1 K], добавлен 29.01.2010

  • Характеристика предметної області: FTP-server для ОС Windows. Шляхи встановлення FTP-серверу в ОС Windows. Опис мови та середовища програмування, компонентів та функцій програми. Аналіз реалізованої програми FTP-клієнта. Тестовий запуск та опис програми.

    курсовая работа [1,7 M], добавлен 22.06.2017

  • Дослідження основних завдань та алгоритму роботи програм копіювання файлів: "COPY1.С" (функції роботи з file handles) та "COPY2.С" (функції потокового вводу-виводу). Повний розбір роботи обох кодів програм, їх тестування, модифікація та оптимізація.

    лабораторная работа [23,4 K], добавлен 04.04.2011

  • Призначення програми на мові Асемблера: захист файлів від несанкціонованого копіювання. Існуючі методи для захисту файлів від несанкціонованого доступу. Криптографія, прив'язка до місця розташування на диску, ключова дискета з нестандартним форматом.

    курсовая работа [24,9 K], добавлен 08.08.2009

  • Розробка програми GameBox, яка включає в себе дві гри, судоку та пятнашки. Опис структури даних та вимоги до них, процедур і функцій користувача, стандартних процедур і функцій, які використовувались в програмі, та файлів. Результати роботи програми.

    курсовая работа [5,3 M], добавлен 12.11.2011

  • Взаємодія комп’ютера з зовнішніми пристроями. Послідовний потік даних як біти синхронізації і власне біти даних. Специфіка формату послідовних даних, які формує UART. Електричний інтерфейс RS-232C. Способи керування портами у WINDOWS95 та WINDOWS XP.

    реферат [660,1 K], добавлен 19.06.2010

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.