powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Проверить что файл ADP открыт аксессом
25 сообщений из 42, страница 1 из 2
Проверить что файл ADP открыт аксессом
    #32725970
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет,

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

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

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

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

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

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

Код: 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
Проверить что файл ADP открыт аксессом
    #32726095
Фотография Лох Позорный
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
только ты эта... осторожнее...
переименовать или удалить он не даст, а вот скопировать поверх уже открытого файла другой с таким же именем - очень даже позволит. последствия непредсказуемы.

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

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

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

у ADP нет LDB файла
...
Рейтинг: 0 / 0
Проверить что файл ADP открыт аксессом
    #32726352
Фотография Latuk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы мой 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
Проверить что файл ADP открыт аксессом
    #32726456
Фотография АлексейК
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нормальные юзеры все равно сподобятся запустить приложение
дважды например даблклик на кнопке таскбара

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


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

у ADP нет LDB файла

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

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


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

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

тока надо надо стандартный и красивый код написать чтоб
можно его было быстренько вставить в автоекзек всех проектов
...
Рейтинг: 0 / 0
Проверить что файл ADP открыт аксессом
    #32726911
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Применительно конкретно к АДП я бы задействовал автоматизацию и не стеснялся этого( если бы у меня дошли руки до такого скрипта)
(Кажется) единственное ограничение по использованию - акцесс должен быть установлен в месте запуска.
Код: (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
Проверить что файл ADP открыт аксессом
    #32726912
Фотография Victosha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно,
Dim objApp As Access.Application
читать как

Dim objApp


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

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

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

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

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

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

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

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

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


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