Създаване на компресиран достъп архивиране на базата данни - софтуер

С това завършва правните въпроси;) и се пристъпи към изучаване на кода.

Ще започна малко по-отдалеч.

Фактът, че опитни фирми за винаги да държат на данните в един файл (MDB), както и прилагането на други (ГДЕ). Ние няма да говорим за ADP и SQL (I особено умен). Толкова е лесно да се организира работата в мрежата - достатъчно, за да разпръснат файл молба на всеки компютър в мрежата и, ако е необходимо, да промените позоваването на файла на масите, да лежи някъде на сървър. Намалява натоварването на мрежата, тъй като всички формуляри, отчети вече са на клиентския компютър в мрежата само предаваните данни, че е лесно да актуализират приложението, - просто достатъчно, за да замени приложенията на новата версия. Аз съм не прави изключение и аз) - всички проекти, финансирани по този начин.

В моите приложения е основният (първоначална) форма frmMainMenu, който се отваря на целия екран, емулира красивите потребителски менюта за по-нататъшно действие. Тази форма няма нищо общо с маси (няма записи код, да не се бърка със стандартната форма клавиатура за достъп!), И поради това не е свързано с файлове с бази данни (маси), т.е. когато отворите файла с форма на база данни не е зает и на разположение за обработка от архиватор. От това следва изводът, че архивираните данни подават само ако няма достъп до мрежа, или на местно ниво - никой друг не е отворил файла. Разбира се, че налага ограничения върху архива, но това е единственият правилен начин - напълно неприемливо да архивни данни по време на работа може, е индексирането, актуализиране, изтриване, така че никога не се знае какво може да се случи в базата данни. Ето защо, ние трябва да се примири строго предупреждение, преди да започнете архивирането, а вероятно и провери достъпността файл. Второто условие - архивиране се случва на компютъра, на който самите данни и са, въпреки че това не е от решаващо значение (това е възможно да се изчисли местоположението на файла с данните от всяко отдалечено приложение на начини за маси, но аз не правя това). За да се предотврати загуба на данни поради повреда на твърдия диск, трябва периодично да изчисти архивните копия на CD / DVD-RW, или на други компютри (спорно). Но това вече други административни проблеми.

Тук е дълъг, но се чувстват необходимостта да се присъедини.

Започвайки форма frmMainMenu отваря на компютрите на потребителите веднага (има достъп до повече данни, да лежи на друг компютър), обхваща целия екран (независимо от разделителната способност на екрана) монитор, и създава работна среда, поради съвпадение експериментално тоналността), част от информацията за програмата , лого дизайнер и интерактивни менюта. Ние пристъпва към разглеждане на кода:

Вариант Сравни Database
Вариант Изрично

"API за да се определи - дали има досие
Лично установено, Функционални PathFileExists Lib "Shlwapi.dll" _
Alias ​​"PathFileExistsA" (ByVal pszPath Както стринга), докато
"Ако искате да се избегне използването на API, е по-лесно да се използва

"Dir () оператор - по-късно в тази статия са дадени примери за

Частни Под LaunchArhiving

Вариант Сравни Database
Вариант Изрично

"За да се определи изпълнението на програмата
Лично установено, Функция OpenProcess Lib "kernel32" (ByVal dwDesiredAccess толкова дълго, ByVal bInheritHandle толкова дълго, ByVal dwProcessId толкова дълго), докато
Лично установено, Функция GetExitCodeProcess Lib "kernel32" (ByVal hProcess толкова дълго, lpExitCode толкова дълго), докато
Лично установено, Функция CloseHandle Lib "kernel32" (ByVal hObject толкова дълго), докато

Строителство STILL_ACTIVE = 259
Строителство PROCESS_QUERY_INFORMATION = 1024

Лично idProg Както дръжка Long "задръжте върху контакта работи прог
Лично bIsStarted Както Булева

Частни Под Form_Open (Отмени Като цяло число)
Дим strAppPath Както стринга
рамка 'Save Path
strAppPath = Application.CurrentProject.Path ""

"Тук е необходимо да проверите наличността WinRar.exe файл в папката. \ AddOns

"Съобщението, което не може да се намери в архива папката WinRar.exe. \ AddOns и изход

"Както и за съществуването на папка. \ Arhives

"Съобщението, че не намира папка \ Arhives на за съхранение на файлове и изход
idProg = Shell (strAppPath "AddOns \ WinRAR на -r М5 -ag_DD-ММ-YYYY_HH-ММ" _

strAppPath "Arhives \ MyDataBase_Data" strAppPath _

"MyDataBase_Data.mdb", vbHide)
bIsStarted = True
End Sub

Частни Под Form_Timer ()
Дим IsRunning Както Булева
Дим hProc толкова дълго, толкова дълго, IRET

Ако bIsStarted Тогава
"Започната и чакат, сър, когато ще външната програма
hProc = OpenProcess (PROCESS_QUERY_INFORMATION, False, idProg)
Ако hProc <> vbNull Тогава GetExitCodeProcess hProc, IRET
IsRunning = (IRET = STILL_ACTIVE)
CloseHandle hProc

Ако не IsRunning Тогава "процесът, не е нищо повече - цял

DoCmd.Close
Крайна сметка, ако
Крайна сметка, ако
End Sub

Проследяване на две събития формират: Open и таймер (трябва да бъде настроен на 1000). Ние извършваме стартирането на подпапка \ AddOns WinRar изпълнимия файл с опции за командния ред. Обърнете внимание на -ag_DD-ММ-YYYY_HH-ММ-ключ, това е, всеки път, когато стартирате архив, архивът ще бъде създаден с новата дата добавя към името на файла. От архивите и ще се натрупват в подпапка \ Arhives на. Много удобен при удължаване суфикс за определяне на датата и часа на архива, и лесно нещо.

Събитието представлява таймер, се случва всяка секунда (1000), дръжка работещ контакт на песен в събитие Form_Open процес. След процеса на проверка (все още е активен?), Ако този процес вече не е активен, това означава, WinRAR.exe процес стартира от нас свърши, и ще закрием формата на предупреждение, ако все още е активен, тогава ние ще чака до следващия таймер събитието.

Както казах по-горе, лесно можете да използвате всеки архиватор, който поддържа командния ред, че е желателно тя се добавя към името на файла има дата и час, както Rar. Въпреки че, може лесно да се създаде име на файл с помощта на VBA код и "приплъзване", съставен ImyaArhiva Формат (дата, "_ дд мм YYYY_") Format (време, "_ HH-ММ") всеки архиватор (например, 7-Zip-долу). Ако смея;) използват WinRar, а след това просто поставете в папката \ AddOns подават WinRar.exe. Нищо друго не за това не е необходимо.

Тъй като ние не говорим за архивиране, споделят съвети още млади програмисти: "натрупване" архивиране на приложения по време на развитието с специални настройки WinRAR. Имам добър навик;) след няколко промени в програмата, щракнете с десния бутон на мишката върху прилагането във файла Explorer (аз предпочитам TC) и изберете от командата на контекстното меню WinRar -> Добавяне към архива "ImyaFayla.rar". Номерът е, че параметрите Rar на историка: "Настройки" -> "профил по подразбиране" -> "Backup", аз създаде ", приложена към името _dd-мм-yyyy_hh-мм архив, приключващ на маска" и сега, избора на тази команда, винаги получавате нов архивен файл, с добавянето на текущата дата и час на създаване. Повече от веднъж, че трябва да се върна, и благодарение на този метод, аз винаги безпогрешно избират правото на "намаление на цените точка." Правя резервни копия по време на работа много често, дори когато се въвеждат незначителни промени в програмата, тя се превърна в доста тромав;)

бутон, за да извършите архивирането, разбира се, е добра, но. Фактът, че потребителите са постоянно забравят да го натиснете. Както се вижда, просто да забравите, които не са специално). Така че аз добавя процедурата за излизане от базата данни като напомняне за архива. Много полезен, когато потребителят затвори програмата - той предложи да направите резервно копие. Тук тя не забравя;)

Отначало се опитах да издаде предупредително съобщение, - чакай малко. дрън, дрън, дрън. Какво момент, в който можете да - всичко е много непредсказуемо - да погледнете индикатора за дискова активност. Да. Аз трябваше да се мисли за по-правилно прилагане и, както винаги, просто е намерено решение;)

Ето как аз пръв писа. И какви проблеми възникват, вече знаете.

и "правилно" изпълнение ще бъде тук, като:

Той отива по-далеч. Както написах по-горе приложения и данни съм съхраняват отделно, базата е на сървъра, няма да работи, и клиентски приложения, разпръснати върху компютрите на потребителите. Клиентското приложение е един и няма разлика, независимо дали тя се изпълнява на сървъра или на клиентската машина. Държа на това, което е необходимо да се провери - дали MyDataBase_Data.mdb файл е в същата папка като заявлението. Ако е, тогава е на сървъра, и можете да направите резервни копия. Всичко това вече е било обсъдено по-горе, аз просто опресняване на паметта). Необходимо е също така да се провери за MyDataBase_Data.ldb за заключване-файл. Ако не съществува този файл - тогава основата е отворен за всяка машина, без значение колко, все пак е невъзможно да се правят резервни копия (и не успеят). Ето защо, дори и да не работят гладко за създаване на резервно копие и да оставите в мълчание). Ако условията за създаване на резервно копие е благоприятен, тогава ние си зададем въпроса напомнянето. Вярвам, че е необходимо на този въпрос, и изведнъж огъня и неотложна необходимост, за да изключите компютъра си;). Шегата, разбира се.

Това е всичко, бутона за излизане код:

"На изхода (натискане добив)
"Проверка на наличността на MyDataBase_Data.mdb файл, ако има нещо,
"Проверка на наличността на MyDataBase_Data.ldb файл, ако това не е
"Оферта да се направи изход архив, ако тя е съгласна, архивиране и изход.
Ако PathFileExists (strAppPath "MyDataBase_Data.mdb") = 1 Тогава "означава, че файлът съществува
Ако PathFileExists (strAppPath "MyDataBase_Data.ldb") <> 1 Тогава

Практическо приложение: като цяло, идеята е добра своята академична описано по-горе). Но след като тества предходната кодекса за добри практики, дойдох до заключението, че е необходимо да се опрости код и силен! )

Разсъждавайки върху опростяване на кода, дойдох до такъв резултат.

Във формуляра за събитие като се започне (този, който винаги съм отворен на екрана като bekgraund) Form_Unload добавете следния код:

Частни Под Form_Unload (Отмени Като цяло число)
Дим strAppPath Както стринга
Дим idProg толкова дълго,
Дим DirectoryFound Както стринга ", за да се провери за наличието на папка

рамка 'Save Path
strAppPath = Application.CurrentProject.Path ""
"На изхода на програмата -
"Проверки за файл PDD_data.mdb нарушения, ако това е така,
"Проверки за файлови Нарушенията PDD_data.ldb, ако не,
"Оферта да се направи изход архив, ако тя е съгласна, архивиране и изход.
Ако Dir (strAppPath "Narusheniya_PDD_data.mdb") <> "" Тогава

"Средства Narusheniya_PDD_data.mdb файлът съществува - тя е на сървъра!
Ако Dir (strAppPath "Narusheniya_PDD_data.ldb") = "" След

"Означава файл за заключване не съществува - никой не държи на файл
Ако MsgBox ( "Не забравяйте да създадете резервно копие на базата данни при завършване на работата." vbCrLf vbCrLf _
"Създаване на резервно копие на базата данни в момента?", VbInformation + vbYesNo, _
"Архивирането на данните след приключване") = vbYes Тогава
"Проверете дали WinRar.exe файл е в папка \ добавки на
Ако Dir (strAppPath "AddOns \ WinRAR.exe") = "" Тогава
MsgBox "Не е намерен в архива WinRar.exe подпапка \ AddOns!", VbCritical, "Невъзможно е да се започне архивиране на базата данни"
Exit Sub
Крайна сметка, ако
"Проверка за папка \ архив
DirectoryFound = Dir (strAppPath "Arhives", vbDirectory)
Ако (Len (DirectoryFound) = 0 или Err = 76) След това "errPathNotFound = 76
MsgBox "Не отидете до папката \ Arhives за поставяне на файл", vbCritical, "не е намерена папка за файлове"
Exit Sub
Крайна сметка, ако
idProg = Shell (strAppPath "AddOns \ WinRAR на -r М5 -ag_DD-ММ-YYYY_HH-ММ" strAppPath "Arhives \ Narusheniya_PDD_data" strAppPath "Narusheniya_PDD_data.mdb", vbNormalFocus)
Крайна сметка, ако
Крайна сметка, ако
Крайна сметка, ако
End Sub

Този код ни дава солидни предимства:

Първо: визуализация на процеса на архивиране, който може да бъде и да се забави и да отмени (на себе си и на прилагането база е затворен, само прозореца архиватор остава на екрана) - потребителят не нервничи на стола на загуба, когато в края всичко това странно процес;) Второ : в папката, където WinRAR.exe, също постави WinRAR.hlp помощния файл - потребителят може да прочетете голяма описание на процеса на архивиране по време на процеса на архивиране, като щракнете върху [помощ] (и аз ви съветвам да се провери), в третата: много по-лесно код и се обърне внимание - целият процес е претърпял п в Unload събитие (начало) форми - т.е. без значение колко потребителят затвори приложението - с кръстче в горния десен ъгъл на формата или издаването предназначен бутона за освобождаване (но само при благоприятни условия за архивиране!) той все още не може да се избегне).

И все пак WinRar - перфектен Archiver, може би най-добрият, но не са свободни, така че всичко ще бъде наред;), ако използвате законно закупени версия.

В този пример аз съм с компресия в стандарт Zip (което мисля, че е оправдано, като се има подкрепата на стандарта в повечето Windows XP) метод за компресиране Нормално - много бързо и достатъчно силно - 48 MB до 6.2 MB компресирани. (Между другото, WinRar примера по-горе прави 48 MB 4.3 MB, но Режим на компресия настроен на максимална). Ако режимът на компресия на максимум, и 7-Zip, после файла се намалява до 6 Mb, но значително увеличава времето на автономна работа - в крайна сметка реших да остана на нормалния начин на Zip компресиране.

Има два начина за използване на архиватор 7-Zip:

първия метод. Ако вече сте инсталирали архива, а след това просто да копирате файла от папката архиватор 7zg.exe (по подразбиране "C: \ Program Files \ 7-Zip \ ..") в AddOns папка \ базата данни. Е, в настройките на Archiver можете да преминете към българския език, ако искаш.

Вторият метод. Ако не искате да инсталирате архиватор или планират да прехвърлят данни към друга машина, малко повече "трудни" - 7-Zip архиватор е необходимо да компресирате файлове и трите, строго подредени в йерархична структура. Можете да оставите минимална структура за създаване на архиви с 7-Zip - лично аз направих това:

AddOns папка във файла се копира 7zg.exe

в папката AddOns, създаване на подпапка кодеци и копират файла там Deflate.dll

в папката AddOns, създаване на подпапка формати и копират файла там zip.dll

това е минимумът, който се изисква архиватор 7-Zip компресиране в Zip (без допълнителна регистрация на компонентите не е необходимо да се извърши).

След като манипулация може да започне да се научат кода - помисли, че минималният 7-Zip вече "инсталира" на машината.

Като основа вземем последния код, който се използва като архиватор WinRar и "заточване" го под 7-Zip:

Частни Под Form_Unload (Отмени Като цяло число)
Дим strAppPath Както стринга
Дим idProg толкова дълго,
Дим DirectoryFound Както стринга ", за да се провери за наличието на папка

рамка 'Save Path
strAppPath = Application.CurrentProject.Path ""
"На изхода на програмата -
"Проверки за файл PDD_data.mdb нарушения, ако това е така,
"Проверки за файлови Нарушенията PDD_data.ldb, ако не,
"Оферта да се направи изход архив, ако тя е съгласна, архивиране и изход.
Ако Dir (strAppPath "Narusheniya_PDD_data.mdb") <> "" Тогава

"Средства Narusheniya_PDD_data.mdb файлът съществува - тя е на сървъра!
Ако Dir (strAppPath "Narusheniya_PDD_data.ldb") = "" След

"Означава файл за заключване не съществува - никой не държи на файл
Ако MsgBox ( "Не забравяйте да създадете резервно копие на базата данни при завършване на работата." vbCrLf vbCrLf _
"Създаване на резервно копие на базата данни в момента?", VbInformation + vbYesNo, _
"Архивирането на данните след приключване") = vbYes Тогава
"Проверете дали 7zg.exe файл е в папка \ добавки на
Ако Dir (strAppPath "AddOns \ 7zg.exe") = "" Тогава
MsgBox "Не е намерен в архива 7zg.exe подпапка \ AddOns!", VbCritical, "Невъзможно е да се започне архивиране на базата данни"
Exit Sub
Крайна сметка, ако
"Проверка за папка \ архив
DirectoryFound = Dir (strAppPath "Arhives", vbDirectory)
Ако (Len (DirectoryFound) = 0 или Err = 76) След това "errPathNotFound = 76
MsgBox "Не отидете до папката \ Arhives за поставяне на файл", vbCritical, "не е намерена папка за файлове"
Exit Sub
Крайна сметка, ако

"Стартиране архиватор
idProg = Shell (strAppPath "AddOns \ 7zg.exe на -tzip" strAppPath "Arhives \ Narusheniya_PDD_data" Формат (дата, "_ дд мм YYYY_") Format (време, "_ HH-ММ") ".zip" strAppPath "Narusheniya_PDD_data.mdb", vbNormalFocus)
Крайна сметка, ако
Крайна сметка, ако
Крайна сметка, ако
End Sub

Това е всичко. Сега можете да с чиста съвест да работи на базата на 7-Zip архив, вие и никой няма да каже лоша дума;)