Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
182 / 33 / 3
Регистрация: 28.05.2015
Сообщений: 148

Как узнать, какой процесс блокирует файл?

10.11.2016, 12:34. Показов 6399. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Перед открытием файла необходимо проверить его "занятость". Если таковая имеется, то CreateFile выдаст "-1".

Вопрос: как определить какой процесс занял файл?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.11.2016, 12:34
Ответы с готовыми решениями:

Как узнать, какой файл выделен в List1 ?
Как узнать, какой файл выделен в List1

Как узнать запущен ли процесс или программа?
Добрый день всем. Подскажите пожалуйста, как программно в VB узнать запущен ли в данный момент тот или иной процесс или программа? ...

Как узнать какой процесс какой файл использует?
Здравствуйте, подскажите как можно узнать какой процесс какой файл использует? Преподаватель предложил использовать хуки, но пока не...

25
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
10.11.2016, 12:50
Поддерживаю тема крайне актуальная и интересная....
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.11.2016, 14:51
На Windows Vista и выше можно использовать Restart Manager для этого.

Только стоит ли оно того? Стоит ли привлекать в помощь такую "тяжелую артиллерию",
как Restart Manager, ради того, чтобы узнать о том, что файл занят другим процессом?
0
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
10.11.2016, 14:59
для проверки открыт ли файл ексел пользуюсь функцией
Visual Basic
1
2
3
4
5
6
7
8
Function IsBookOpen(wbFullName As String) As Boolean
    Dim iFF As Integer
    iFF = FreeFile
    On Error Resume Next
    Open wbFullName For Random Access Read Write Lock Read Write As #iFF
    Close #iFF
    IsBookOpen = Err
End Function
Добавлено через 1 минуту
тут нет привязки к приложению ексел. Возможно будет работать и для других типов файлов
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 634
10.11.2016, 15:05
Цитата Сообщение от Alex77755 Посмотреть сообщение
тут нет привязки к приложению ексел. Возможно будет работать и для других типов файлов
не то, вопрос был в том, кто его открыл, а не открыт ли он...
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
10.11.2016, 15:09
Как вариант (не проверял). Перечислить все хендлы в системе и найти хендл файла, далее по pid получить имя процесса. Так кстати делает Windows Vista и выше для определения процесса.
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
10.11.2016, 15:24
До Висты не было никакого специального способа найти процесс, который держит файл. Это согласуется с концепцией не хранить информацию, которая не нужна. Файловую систему не заботит, кто там держит её файлы. Её задача - закрыть файл, когда уйдёт последняя ссылка на него.
Теперь есть интерфейс IFileIsInUse с набором методов, которые позволяют это узнать и даже попросить освободить файл. Вот только можно ли его прикрутить на древний VB6, это вопрос?
2
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
10.11.2016, 16:15
Pro_grammer, насколько мне известно для обеспечения такой функциональности нужна поддержка со стороны приложений. И интерфейс IFileIsInUse не поможет если файл просто открыт через CreateFile (в случае с VB Open statement). Т.е. приложение открывшее файл должно создать отдельный объект с IFileIsInUse имплементацией, создать моникер с именем файла и зарегистрировать все это в ROT. Только в этом случае можно будет из VB (и вообще из любого ЯП) получить доступ к этому объекту и его методам. Т.к. в VB6 нативная поддержка COM - на нем реализовать и использовать IFileIsInUse интерфейс не составит труда.
http://programing-fun.blogspot... ature.html
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
10.11.2016, 20:28
Цитата Сообщение от The trick Посмотреть сообщение
Так кстати делает Windows Vista и выше для определения процесса.
Откуда такая информация? Vista и выше "из коробки" поддерживает Restart Manager,
ей незачем связываться с перечислением хэндлов. Вот здесь в блоге GunSmoker-а
есть неплохое описание:

Как мне найти программу, которая держит этот файл?
http://www.transl-gunsmoker.ru... st_18.html
2
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
11.11.2016, 01:49
Цитата Сообщение от Убежденный Посмотреть сообщение
Откуда такая информация?
Там я ссылочку в 8 посту прикрепил, правда там не написано что именно перечисление хендлов, но описано что используется NtQuerySystemInformation.
Цитата Сообщение от Убежденный Посмотреть сообщение
Vista и выше "из коробки" поддерживает Restart Manager,
ей незачем связываться с перечислением хэндлов.
Да, но сам Restart Manager как-то же получает информацию? Немного пореверсил, действительно сначала Explorer пытается выудить информацию по IFileIsInUse, затем в случае неудачи опрашивает Restart Manager, который в свою очередь получает список процессов, использующих файл, посредством NtQueryInformationFile с флагом FileProcessIdsUsingFileInformation что позволяет получить список PID'ов которые юзают файл.
2
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.11.2016, 09:13
Цитата Сообщение от The trick Посмотреть сообщение
Да, но сам Restart Manager как-то же получает информацию? Немного пореверсил, действительно сначала Explorer пытается выудить информацию по IFileIsInUse, затем в случае неудачи опрашивает Restart Manager, который в свою очередь получает список процессов, использующих файл, посредством NtQueryInformationFile с флагом FileProcessIdsUsingFileInformation что позволяет получить список PID'ов которые юзают файл.
Да, спасибо.
Я просто хотел подчеркнуть, что старые традиционные способы, связанные именно с
перечислением хэндлов, такие как этот:

HOWTO: Enumerate handles
http://forum.sysinternals.com/... 18892.html

на Vista и выше уже можно не использовать.
Да и системе незачем прибегать к перечислению хэндлов во всех процессах,
так как нужная информация у нее уже есть и хранится в специальной структуре.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2016, 09:59
Поправьте, если я не правильно понимаю, этими функциями нельзя определить с какими привилегиями открыт файл, на чтение или на запись?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
12.11.2016, 15:48
Цитата Сообщение от Dragokas Посмотреть сообщение
этими функциями нельзя определить с какими привилегиями открыт файл, на чтение или на запись?
Restart Manager API - нельзя.
NtQuerySystemInformation с SystemHandleInformation - можно, но только
при условии, что есть доступ к памяти ядра (читай - нужен драйвер).
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2016, 15:59
Жаль. Была задача определить, скачался ли файл или ещё в процессе. Вот только браузер (проверял хром) выставляет флаг FILE_SHARE_WRITE, в итоге простого открытия файла с флагом GENERIC_WRITE недостаточно, чтобы это узнать.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
12.11.2016, 17:27
А если попробовать так:
  1. Получить хендл файла, перечислением хендлов;
  2. Вызвать ZwQueryInformationFile с флагом FileAccessInformation или FileAllInformation;
  3. Получить маску доступа из FILE_ACCESS_INFORMATION.
?
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2016, 17:47
Это же ACL. Права юзера на файл в целом (вкладка безопасность свойства файла).
Не имеет отношения к теме, открыт ли кем-то файл с доступом на запись.

Добавлено через 9 минут
ну то есть покажет, какие клиент имеет права, а не какими воспользовался.

Добавлено через 2 минуты
Хотя нет, мы же передаём в функцию уже открытый хендл файла. А если он открыт только на чтение, то функция по идее должна показать, что у хенда в ACCESS_MASK нет прав на запись.
Таки нужно проверить...
(т.е. вопрос в том, что в MSDN означает слово "клиент", юзер, который открывал хендл, или привилегии самого хендла)
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
12.11.2016, 18:24
Цитата Сообщение от Dragokas Посмотреть сообщение
Не имеет отношения к теме, открыт ли кем-то файл с доступом на запись.
Visual Basic
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Option Explicit
 
Private Const GENERIC_WRITE           As Long = &H40000000
Private Const GENERIC_READ            As Long = &H80000000
Private Const FILE_READ_DATA          As Long = (&H1)
Private Const FILE_WRITE_DATA         As Long = (&H2)
Private Const FILE_APPEND_DATA        As Long = (&H4)
Private Const FILE_READ_EA            As Long = (&H8)
Private Const FILE_WRITE_EA           As Long = (&H10)
Private Const FILE_EXECUTE            As Long = (&H20)
Private Const FILE_READ_ATTRIBUTES    As Long = (&H80)
Private Const FILE_WRITE_ATTRIBUTES   As Long = (&H100)
Private Const CREATE_ALWAYS           As Long = 2
Private Const OPEN_EXISTING           As Long = 3
Private Const FILE_SHARE_READ         As Long = &H1
Private Const FILE_SHARE_WRITE        As Long = 2
Private Const FileAccessInformation   As Long = 8
Private Const FILE_ATTRIBUTE_NORMAL   As Long = &H80
 
Private Type FILE_ACCESS_INFORMATION
    AccessFlags As Long
End Type
 
Private Type IO_STATUS_BLOCK
    Status As Long
    Information As Long
End Type
 
Private Declare Function ZwQueryInformationFile Lib "ntdll.dll" ( _
                         ByVal hFile As Long, _
                         ByRef IoStatusBlock As Any, _
                         ByRef Buff As Any, _
                         ByVal bufSize As Long, _
                         ByVal FileInformation As Long) As Long
Private Declare Function CreateFile Lib "kernel32" _
                         Alias "CreateFileW" ( _
                         ByVal lpFileName As Long, _
                         ByVal dwDesiredAccess As Long, _
                         ByVal dwShareMode As Long, _
                         ByRef lpSecurityAttributes As Any, _
                         ByVal dwCreationDisposition As Long, _
                         ByVal dwFlagsAndAttributes As Long, _
                         ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
                         ByVal hObject As Long) As Long
                        
Private Sub Form_Load()
    Dim io_status   As IO_STATUS_BLOCK
    Dim hFile1      As Long
    Dim hFile2      As Long
    Dim accInf1     As FILE_ACCESS_INFORMATION
    Dim accInf2     As FILE_ACCESS_INFORMATION
    
    hFile1 = CreateFile(StrPtr("C:\Temp\test.txt"), GENERIC_READ Or GENERIC_WRITE, _
                        FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
    hFile2 = CreateFile(StrPtr("C:\Temp\test.txt"), GENERIC_READ, _
                        FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    
    ZwQueryInformationFile hFile1, io_status, accInf1, Len(accInf1), FileAccessInformation
    ZwQueryInformationFile hFile2, io_status, accInf2, Len(accInf2), FileAccessInformation
    
    CloseHandle hFile2
    CloseHandle hFile1
    
    Debug.Print "Access mask for file1:",:  PrintAccess (accInf1.AccessFlags)
    Debug.Print "Access mask for file2:",:  PrintAccess (accInf2.AccessFlags)
    
End Sub
 
Private Sub PrintAccess( _
            ByVal lAccess As Long)
    Dim sResult As String
    
    If lAccess And FILE_READ_DATA Then AppendString sResult, "FILE_READ_DATA"
    If lAccess And FILE_WRITE_DATA Then AppendString sResult, "FILE_WRITE_DATA"
    If lAccess And FILE_APPEND_DATA Then AppendString sResult, "FILE_APPEND_DATA"
    If lAccess And FILE_READ_EA Then AppendString sResult, "FILE_READ_EA"
    If lAccess And FILE_WRITE_EA Then AppendString sResult, "FILE_WRITE_EA"
    If lAccess And FILE_EXECUTE Then AppendString sResult, "FILE_EXECUTE"
    If lAccess And FILE_READ_ATTRIBUTES Then AppendString sResult, "FILE_READ_ATTRIBUTES"
    If lAccess And FILE_WRITE_ATTRIBUTES Then AppendString sResult, "FILE_WRITE_ATTRIBUTES"
    
    Debug.Print Hex(lAccess), sResult
    
End Sub
 
Private Sub AppendString( _
            ByRef sRes As String, _
            ByRef sAppended As String)
    If Len(sRes) Then
        sRes = sRes & " | " & sAppended
    Else
        sRes = sAppended
    End If
End Sub
Результат:
Access mask for file1: 12019F FILE_READ_DATA | FILE_WRITE_DATA | FILE_APPEND_DATA | FILE_READ_EA | FILE_WRITE_EA | FILE_READ_ATTRIBUTES | FILE_WRITE_ATTRIBUTES
Access mask for file2: 120089 FILE_READ_DATA | FILE_READ_EA | FILE_READ_ATTRIBUTES
Первый файл открыт на запись, второй на чтение.
2
12.11.2016, 19:55

Не по теме:


The trick, хорошие, очень хорошие ответы!
Браво!
Чувствую, пора мне уже на пенсию ))

0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18030 / 7733 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2016, 21:57
Убежденный, рано тебе на пенсию.

Если указать хендл, открытый чужим процессом, ZwQueryInformationFile выдает ошибки NTSTATUS:
0xC0000024
STATUS_OBJECT_TYPE_MISMATCH

0xC0000008
STATUS_INVALID_HANDLE
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
12.11.2016, 22:14
Цитата Сообщение от Dragokas Посмотреть сообщение
Если указать хендл, открытый чужим процессом, ZwQueryInformationFile выдает ошибки NTSTATUS:
А DuplicateHandle вызывалось?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.11.2016, 22:14
Помогаю со студенческими работами здесь

Узнать какой процесс заблокировал файл
Всех приветствую! Мужики, в NET случайно нет методов, которыми можно узнать, какой процесс заблокировал файл? Нашел в интернете код...

Узнать какой процесс пишет в файл
Здравствуйте. На компе есть вирус, который добавляет записи в hosts. Антивирус касперского его не находит. Есть ли способ узнать какой...

Как узнать какой процесс
Привет всем! Подскажите, есть сервер на Debian, на нем какая я то пакость, которая постоянно перемещает директорию, как найти эту...

Узнать, что блокирует процесс и завершить его
Работаю над антибаннером (для олимпиады). Как узнать кто блокирует процесс explorer.exe? И если можно то завершить его.

Как узнать какой процесс не дает загрузить Win 7
При загрузке Win 7 черный экран с мышкой и все. диспетчер задач не открывается. точек восстановления нет. загружается в безопасный режим...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru