Как получить список файлов, открытых приложением в среде Delphi
Для того чтобы получить список файлов, открытых определённым приложением в среде Delphi, можно использовать различные подходы. Один из них заключается в использовании нативного API функции NtQuerySystemInformation, которая позволяет перечислить все открытые дескрипторы (handlers) из всех процессов.
Вот пример кода на Object Pascal, который демонстрирует, как можно перечислить все открытые файлы в системе:
program ListAllHandles;
{$APPTYPE CONSOLE}
uses
PSApi,
Windows,
SysUtils;
const
SystemHandleInformation = $10;
STATUS_SUCCESS = $00000000;
STATUS_BUFFER_OVERFLOW = $80000005;
STATUS_INFO_LENGTH_MISMATCH = $C0000004;
DefaultBufferSize = $100000;
type
OBJECT_INFORMATION_CLASS = (ObjectBasicInformation, ObjectNameInformation, ObjectTypeInformation, ObjectAllTypesInformation, ObjectHandleInformation);
SYSTEM_HANDLE = packed record
uIdProcess: ULONG;
ObjectType: UCHAR;
Flags: UCHAR;
Handle: Word;
pObject: Pointer;
GrantedAccess: ACCESS_MASK;
end;
// ... (продолжение типов и функций)
procedure EnumerateOpenFiles;
var
// ... (переменные для процедуры)
begin
// ... (инициализация и подготовка буфера)
NTQuerySystemInformation := GetProcAddress(GetModuleHandle('NTDLL.DLL'), 'NtQuerySystemInformation');
if (@NTQuerySystemInformation <> nil) then
begin
// ... (продолжение процедуры перечисления файлов)
for aIndex := 0 to pHandleInfo^.uCount - 1 do
begin
// ... (проверка и открытие процесса для получения дополнительной информации)
if (hProcess <> INVALID_HANDLE_VALUE) then
begin
// ... (получение копии дескриптора)
if DuplicateHandle(hProcess, pHandleInfo.Handles[aIndex].Handle, GetCurrentProcess(), @hObject, STANDARD_RIGHTS_REQUIRED, FALSE, 0) then
begin
// ... (получение имени файла, связанного с дескриптором)
if (lpwsName <> nil) then
begin
// ... (получение типа объекта и имени процесса)
Writeln('PID ', pHandleInfo.Handles[aIndex].uIdProcess);
Writeln('Handle ', pHandleInfo.Handles[aIndex].Handle);
Writeln('Process ', sDummy);
Writeln('FileName ', string(lpwsName));
Writeln;
// ... (освобождение памяти)
end;
CloseHandle(hObject);
end;
CloseHandle(hProcess);
end;
end;
end;
FreeMem(pHandleInfo);
end;
begin
try
// ... (попытка выполнения процедуры перечисления файлов)
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Обратите внимание, что данный код является упрощённым примером и предназначен для демонстрации использования функции NtQuerySystemInformation. В реальном приложении могут потребоваться дополнительные проверки и обработка ошибок.
Также стоит учесть, что использование нативного API может быть нестабильным из-за изменений в операционной системе. Поэтому, если вы хотите поддерживать совместимость вашего приложения, рекомендуется использовать альтернативные функции и методы, предоставляемые операционной системой.
Для получения списка файлов, открытых конкретным приложением, например winword.exe, вам потребуется дополнительно отфильтровать результаты, полученные с помощью данного кода, чтобы вывести только те файлы, которые связаны с нужным процессом.
Контекст: Для получения списка файлов, открытых приложением в среде Delphi, можно использовать нативный API для перечисления открытых дескрипторов файлов в системе.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.