Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проверить что файл ADP открыт аксессом / 25 сообщений из 42, страница 1 из 2
06.10.2004, 14:11:13
    #32725970
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Всем привет,

вот решил доработать VBS скрипт автообновлялки клиентской части.

С целью избежания повторного запуска приложения если уже файл открыт делаю так:
пробую скопировать новый файл под рабочим именем если ошибка значит файл открыт ...

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

getobject не катит так как он создает объект если файл не открыт.
атрибуты не меняются
винапи в VBS не доступны вроде

сейчас VBS код примерно такой:
http://kozin1.narod.ru/newsite/index.html?autoupdateclient.htm
...
Рейтинг: 0 / 0
06.10.2004, 14:33:30
    #32726031
я
я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Try:
Kill FilePath
if Err<>0 Then
...
...
Рейтинг: 0 / 0
06.10.2004, 14:36:48
    #32726042
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
убивать не подойдет
файл нужен.

проверять на занятость надо при каждом запуске скрипта
а не только когда копируется обновляется файл
...
Рейтинг: 0 / 0
06.10.2004, 14:43:47
    #32726055
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
не хочешь убивать - тогда переименовывай туда-сюда
...
Рейтинг: 0 / 0
06.10.2004, 14:52:59
    #32726080
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Йесс, то что нужно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
On Error Resume Next
if  cdate(srcfiledate) = cdate(currentfiledate) then
 'Обновление не требуется 
 'Пробуем переименовать файл сам в себя 
	call Fso.moveFile (DestPath, DestPath)
 else
	call Fso.CopyFile (SrcPath, DestPath,  true)
end if
...
Рейтинг: 0 / 0
06.10.2004, 14:57:56
    #32726095
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
только ты эта... осторожнее...
переименовать или удалить он не даст, а вот скопировать поверх уже открытого файла другой с таким же именем - очень даже позволит. последствия непредсказуемы.

я бы сделать попытку переименования первым же шагом, и если неудачно, значит немедленное катапультирование из скрипта.
...
Рейтинг: 0 / 0
06.10.2004, 14:58:21
    #32726096
я
я
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
АлексейКубивать не подойдет
файл нужен.

проверять на занятость надо при каждом запуске скрипта
а не только когда копируется обновляется файл
переименуй, смени атрибуты, передвинь и т.п.

или убей ldb (не точно проинформирует о занятости, но о занятости аксессом или джетом)
...
Рейтинг: 0 / 0
06.10.2004, 15:37:32
    #32726239
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
копировать поверх не дает - проверено пишет нет доступа

у ADP нет LDB файла
...
Рейтинг: 0 / 0
06.10.2004, 16:11:34
    #32726352
Latuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Чтобы мой ADE-ник юзера не могли запустить два раза
я при запуске проверяю а не запущен ли он уже
если запущен активирую первый,а второй завершаю(или не запускаю).

Как условие "если уже файл открыт" ищу win окно с определенным заголовком
только заголовок надо делать по возможности уникальным (например используя кавычки)
ато возможны баги когда за прогу будет принята
открытая для просмотра одноименная папка

Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String _
) As Long

Private Declare Function apiShowWindow Lib "user32" Alias "ShowWindow" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hWnd As Long) As Long
Public Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
Public gHwnd As Long
Private mm As String
Private mFindStr As String
Private chkFind As Boolean

Public Const HWND_TOPMOST = -1
Public Const HWND_NOTOPMOST = -2
Public Const SWP_NOMOVE = &H2
Public Const SWP_NOSIZE = &H1
Public Const SWP_NOACTIVATE = &H10
Public Const SWP_SHOWWINDOW = &H40


'SetTitle strProjectName при старте установить условленный заголовок
'SetTitle "" при завершении сбросить

'--Обновляет заголовок приложения
Sub SetTitle(strPN As String)
On Error Resume Next
CurrentProject.Properties("AppTitle").Value = strPN
Application.RefreshTitleBar
End Sub


Public Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Boolean
Dim sSave As String, Ret As Long
Dim I As Long
Ret = GetWindowTextLength(hWnd)
sSave = Space(Ret)

GetWindowText hWnd, sSave, Ret + 1

If Len(Trim(sSave)) > 0 Then
'Debug.Print sSave & "-" & hwnd
I = InStr(1, sSave, " - [")
If I > 0 Then
mm = Mid(sSave, 1, I - 1)
If mm = mFindStr Then
gHwnd = hWnd
chkFind = True
EnumWindowsProc = False
Exit Function
End If
Else
mm = sSave
If mm = mFindStr Then
mm = sSave
gHwnd = hWnd
chkFind = True
EnumWindowsProc = False
Exit Function
End If
End If
End If
EnumWindowsProc = True
End Function
Function IsLoadedPr(FindStr As String) As Boolean
gHwnd = 0
chkFind = False
mFindStr = FindStr
Call EnumWindows(AddressOf EnumWindowsProc, 0)
IsLoadedPr = chkFind
End Function

После в коде проверяеш
If IsLoadedPr(strProjectName) Then

если да значит приложение с таким заголовком запущено
PS нормальные герои всегда идут в обход :)
...
Рейтинг: 0 / 0
06.10.2004, 16:37:35
    #32726456
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Нормальные юзеры все равно сподобятся запустить приложение
дважды например даблклик на кнопке таскбара

могут и обе версии друг друга найти и выгрузиться


в последней версии скрипта заложено сохранение времени последнего запуска
и проверка - если таймаут меньше 5 сек то отмена загрузки.
...
Рейтинг: 0 / 0
06.10.2004, 16:44:17
    #32726478
Latuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
>дважды например даблклик на кнопке таскбара
не не получится
одно успеет все равно раньше
другое его найдет и завершится не устанавливая свой заголовок
>могут и обе версии друг друга найти и выгрузиться
Не не могут
я же только после проверки заголовок устанавливаю на условный.
баг может быть тока один
приложение будет принимать за себя другое приложение если
у него окажется такой-же заголовок (случай с одноименной папкой)
для этого надо чуток уникальности добавить в строку
например кавычек или имя юзера
...
Рейтинг: 0 / 0
06.10.2004, 16:48:40
    #32726490
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
2 Latuk
Два приложения запустятся (с небольшим интервалом)
Заголовок у обоих еще не выставлен (т.к. проверка еще не прошла)
Ни одно из них не найдет другого (т.к. заголовок еще не выставлен)
Спокойно запустятся и дружно (с небольшим интервалом) выставят заголовок.
...
Рейтинг: 0 / 0
06.10.2004, 16:54:44
    #32726508
Latuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
>Два приложения запустятся (с небольшим интервалом)
Я пробовал запускать из bat файла подряд
это гораздо меньший промежуток чем может сделать юзер
одно успевало установить заголовок раньше чем другое начинало искать.
хотя метод конечно не лишен недостатков.
просто нашел ,скопировал ,проверил - работает и ладно.
...
Рейтинг: 0 / 0
06.10.2004, 16:56:36
    #32726512
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Неправильная версия должна посылать юзера нах и отказатьсяя работать. в базе должно быть прописано, какя мнммальная версия требуется дла работы. верию приложения можно хранить в application.CurrentProject.Properties
...
Рейтинг: 0 / 0
06.10.2004, 16:59:52
    #32726525
Лох Позорный
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Я пробовал запускать из bat файла подряд
это гораздо меньший промежуток чем может сделать юзер
хороший юзер может сделать то, что никакому bat'у и не снилось
...
Рейтинг: 0 / 0
06.10.2004, 17:31:10
    #32726611
Alexey Sh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
А кто мешает использовать Windows API CreateMutex и не устаивать разборки с классическими "гонками" ?
...
Рейтинг: 0 / 0
06.10.2004, 17:44:24
    #32726650
Витал
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
АлексейКкопировать поверх не дает - проверено пишет нет доступа

у ADP нет LDB файла

У меня дает и не спрашивает... Только потому 1-2 юзера (у тех, у кого он был в это время открыт) при следующем запуске кричат, что файл разрушен и не открывается. Я им вручную повторно копирую и ... все довольны. Хотя, конечно, я не прав... Но, блин, лень как Алексею искать пути-выходы. А м.б. это пока "петух жареный" не клюнул... И хай не клюется эта птица!!!
...
Рейтинг: 0 / 0
06.10.2004, 17:54:40
    #32726680
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Виталпри следующем запуске кричат, что файл разрушен и не открывается.

кстати видел такой фокус на развалюшке c w98 которая не SR2
перестваили винду все стало работать


Alexey Sh А кто мешает использовать Windows API CreateMutex и не устаивать разборки с классическими "гонками" ?

видимо это единственный "правильный" способ.

тока надо надо стандартный и красивый код написать чтоб
можно его было быстренько вставить в автоекзек всех проектов
...
Рейтинг: 0 / 0
06.10.2004, 20:30:40
    #32726911
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
Применительно конкретно к АДП я бы задействовал автоматизацию и не стеснялся этого( если бы у меня дошли руки до такого скрипта)
(Кажется) единственное ограничение по использованию - акцесс должен быть установлен в месте запуска.
Код: (wsh 5.6)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
Const ERR_APP_NOTFOUND As Long =  429 


Function IsAppOpened(strFullPathName)
   IsAppOpened = False
   Dim objApp As Access.Application
   Dim strNotFound

   strNotFound = "Акцесс не установлен на этой машине. " _
      & vbCrLf & "Выполнение проверки прервано."
   strFileOpened = "Файл уже открыт другим пользователем."
   On Error Resume Next
   
   Set objApp = CreateObject("Access.Application")
   
   If Err = ERR_APP_NOTFOUND Then
      'акцесс не установлен 
      MsgBox strNotFound
      Exit Function
   End If
    
    objApp.OpenAccessProject strFullPathName, True
    If Err <>  0  Then
       MsgBox Err.Number & vbNewLine & Err.Description
       IsAppOpened = True
   Else
     objApp.CloseCurrentDatabase
    End If
    objApp.Quit
    
End Function
...
Рейтинг: 0 / 0
06.10.2004, 20:31:57
    #32726912
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
конечно,
Dim objApp As Access.Application
читать как

Dim objApp


(с выражением лица)
...
Рейтинг: 0 / 0
07.10.2004, 09:48:43
    #32727255
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
2 Victosha
первый вариант который я пробовал был именно такой
правда был exe на VB написан

недостатки:
1 запуск аксесса - гораздо дольше проверки файла
2 если файл закрыт на момент проверки то после завершения скрипта аксесс закрывается так как объект создан из разрушаемого.

кстати в моем скрипте есть проверка на предмет установленности нужной версии аксесса (спасибо Хаммеру)
...
Рейтинг: 0 / 0
07.10.2004, 10:02:14
    #32727284
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
АлексейК2 Victosha
первый вариант который я пробовал был именно такой
правда был exe на VB написан

недостатки:
1 запуск аксесса - гораздо дольше проверки файла

Я не смотрел внимательно зачем такой скрипт нужен. Кажется, что это не критично для скрипта, цель которого - сравнить локальную и удаленную версию и скопировать удаленную на локальный диск.
Ну подними на старте собственный акцесс ( один ил идва глобальных на скрипт) и пользуй его. На последнем шаге просто сделай его видимым.
Возможная проблема - пользователь скучает. Так добавь скрипту визуальности.
Помести скрипт в hta и пусть он будет пускачем. А пока оно шеволится юзеру шары покатать на экране
:))

АлексейК
2 если файл закрыт на момент проверки то после завершения скрипта аксесс закрывается так как объект создан из разрушаемого.
<...>
((;
В этой фразе я не понял слов. Если можно, поясни как это понимать надо.
...
Рейтинг: 0 / 0
07.10.2004, 10:50:54
    #32727420
АлексейК
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
- при незагруженности приложения скрипт обновляет файл
и запускает приложение
- если приложение просто свернуто то максимизирует его

если объект создавать в скрипте то по завершению скрипта закроется и аксесс
...
Рейтинг: 0 / 0
07.10.2004, 11:00:35
    #32727456
Victosha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
[quot АлексейК
<...>
если объект создавать в скрипте то по завершению скрипта закроется и аксесс[/quot]

Видно я сегодня не выспался.
Ну не понимаю я этого и всё тут.
Куда он закроется и зачем.

Конечно, допускаю, что я опять всего не помню, чего не знаю,
но не до такой же степени...
...
Рейтинг: 0 / 0
07.10.2004, 11:03:31
    #32727466
Hummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверить что файл ADP открыт аксессом
2 АлексейК
После выполнения скрипта или любого кода создающего объект (Аксес) этот объект не закроется, если он не будет закрыт в коде или в скрипте. Отсюда у многих возникает проблема - как закрыть Ексель...
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проверить что файл ADP открыт аксессом / 25 сообщений из 42, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]