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

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

10.11.2016, 12:34. Показов 6500. Ответов 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
18033 / 7736 / 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
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2016, 15:59
Жаль. Была задача определить, скачался ли файл или ещё в процессе. Вот только браузер (проверял хром) выставляет флаг FILE_SHARE_WRITE, в итоге простого открытия файла с флагом GENERIC_WRITE недостаточно, чтобы это узнать.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
12.11.2016, 17:27
А если попробовать так:
  1. Получить хендл файла, перечислением хендлов;
  2. Вызвать ZwQueryInformationFile с флагом FileAccessInformation или FileAllInformation;
  3. Получить маску доступа из FILE_ACCESS_INFORMATION.
?
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2016, 17:47
Это же ACL. Права юзера на файл в целом (вкладка безопасность свойства файла).
Не имеет отношения к теме, открыт ли кем-то файл с доступом на запись.

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

Добавлено через 2 минуты
Хотя нет, мы же передаём в функцию уже открытый хендл файла. А если он открыт только на чтение, то функция по идее должна показать, что у хенда в ACCESS_MASK нет прав на запись.
Таки нужно проверить...
(т.е. вопрос в том, что в MSDN означает слово "клиент", юзер, который открывал хендл, или привилегии самого хендла)
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2016, 21:57
Убежденный, рано тебе на пенсию.

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

0xC0000008
STATUS_INVALID_HANDLE
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru