1

Тема: VBS: Проверка открыт файл или нет

Как можно проверить открыт файл или нет?
Была идея переименовать файл в свое же имя и считать код ошибки, но чето выдает ошибку 58.

К тому же в Windows 7 на примере Doc, можно переименовать открытые файлы Office 2010.
Открываем файл doc в ворде и переименовываем файл и все проходит корректно, только когда потом пытаешься произвести сохранение документа ворд говорит "Убедитесь, что задвижка дисковода закрыта и он содержит правильный диск "

Кто что-нибудь может подсказать?



MsgBox File.Name
MsgBox "Err.Number = " &Err.Number
On Error Resume Next
File.Name = File.Name
MsgBox "Err.Number = " &Err.Number
On Error Goto 0

2

Re: VBS: Проверка открыт файл или нет

Попробовать открыть файл на дозапись.

Забыл пароль и потерял e-mail.

3

Re: VBS: Проверка открыт файл или нет

А если файл будет EXE ? Чето не оч вариант.

4 (изменено: shiz, 2014-03-19 16:32:14)

Re: VBS: Проверка открыт файл или нет

wildwolf007 пишет:

А если файл будет EXE ?

В чём разница? Проверка работает (код ошибки 70, если файл занят).

Забыл пароль и потерял e-mail.

5

Re: VBS: Проверка открыт файл или нет

Выдает ошибку 424 может что-то не так сделал?




Dim  objFso
Set objFso = CreateObject("Scripting.FileSystemObject") 

MsgBox "Код ошибки до Err.Number = " &Err.Number

On Error Resume Next

Dim OpenFileBuzyCheck
Set OpenFileBuzyCheck = objFso.OpenTextFile("C:\12345671.rtf", 8, True)
OpenFileBuzyCheck.Close

MsgBox "Err.Number = После открытия на дозапись = " &Err.Number

If Err.Number > 0 Then
    MsgBox "Файл занят" &"Err.Number = " &Err.Number
    MsgBox "Сработало условие Err.Number = " &Err.Number
End IF
Err.Clear
MsgBox "Err.Number = Проверка кода ошибки после чистки " &Err.Number
On Error Goto 0

6

Re: VBS: Проверка открыт файл или нет

А что говорит err.description?

Забыл пароль и потерял e-mail.

7

Re: VBS: Проверка открыт файл или нет

Пишет: "Требуется объект".

8 (изменено: Rom5, 2014-03-24 19:22:11)

Re: VBS: Проверка открыт файл или нет

wildwolf007 пишет:

Пишет: "Требуется объект".

Возможно, что ошибку проверять надо до закрытия файла?

WBR. Roman

9

Re: VBS: Проверка открыт файл или нет

Спасибо помогло.

Теперь пишет разрешение отклонено.





Dim  objFso
Set objFso = CreateObject("Scripting.FileSystemObject") 

MsgBox "Код ошибки до Err.Number = " &Err.Number

On Error Resume Next

Dim OpenFileBuzyCheck
Set OpenFileBuzyCheck = objFso.OpenTextFile("C:\12345671.rtf", 8, True)


MsgBox "Err.Number = После открытия на дозапись = " &Err.Number
MsgBox "err.description" &err.description
If Err.Number > 0 Then
    MsgBox "Файл занят" &"Err.Number = " &Err.Number
    MsgBox "Сработало условие Err.Number = " &Err.Number
End IF
Err.Clear
MsgBox "Err.Number = Проверка кода ошибки после чистки " &Err.Number

OpenFileBuzyCheck.Close

On Error Goto 0


10

Re: VBS: Проверка открыт файл или нет

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

11

Re: VBS: Проверка открыт файл или нет

…если открытый файл находится на USB накопителе или в "простонародии" на флешке, то данный метод нельзя применять.

У меня работает.
Возможно, причина в
1) используемом накопителе (способе его подключения, драйвере…) или
2) программа, открывающая файл, не блокирует его, если он находится на съёмном носителе.

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

rem:>>"G:\1234.rtf"

или

set /p=<nul>>"G:\1234.rtf"

— должно ответить

Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.

или просто попробуйте изменить файл в Блокноте…

Чтобы самому заблокировать файл введите в командной строке

(pause>con)>>"G:\1234.rtf"

— файл будет заблокирован на время паузы.

12 (изменено: Flasher, 2014-03-25 14:42:25)

Re: VBS: Проверка открыт файл или нет

ИМО, лучше узнавать текущий запуск через WQL-запрос:

Select ExecutablePath FROM Win32_Process WHERE CommandLine Like '%Буква диска:\\Путь\\к\\файлу%'

wildwolf007
Чтобы не было лишних вопросов:

Path = "X:\\Файл.ext"
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
For Each F in WMI.ExecQuery("SELECT ExecutablePath FROM Win32_Process WHERE CommandLine Like '%" & Path & "%'")
  MsgBox "Файл открыт приложением: " & vbNewLine & F.ExecutablePath, 64, Space(13) & "Проверка запуска файла"
Next : Set WMI = Nothing