@AlexSofar

Как получить пути файлов и папок которые на данный момент использует процесс в C#?

Нужен метод который мог бы циклический проверять какой файл или папка используется в данный момент процессом и возвращал список для дальнейшего анализа путей. Не так давно узнал про PerformanceCounter что частично упростило мне жизнь. Но так и весит этот вопрос, по идеи сам проект завис. Так как концепция моего приложения требует решение данного вопроса . Есть пример чего я хочу достичь это стандартная оснастка Resource Monitor под винду. Там есть вкладка Диск > Работа диска просто выбираешь любой процесс и можно увидеть все файлы и папки открытые этим процессом, збс че так же хочу. Собственно поэтому я еще не слился, так как предполагаю что есть API под это дела. Net Framework толстый, ни одной жизни программиста не хватит чтобы все изучить. Любые варианты решения обсудим.

Лучше один раз показать:
5f5ba648c127a881105419.png
  • Вопрос задан
  • 220 просмотров
Решения вопроса 1
petermzg
@petermzg
Самый лучший программист
Примерно так
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern SafeProcessHandle OpenProcess(int access, bool inherit, int processId);

using (var processHandler = SafeProcessHandle.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, processId))
{
     if (!processHandler.IsInvalid)
     {
          int needed = 0;
          IntPtr[] hMods = new IntPtr[1024];
           var strBuilder = new StringBuilder(1024);
           var handle2 = new GCHandle();
           try
           {
                 if (!GetModuleFileNameEx(processHandler, IntPtr.Zero, strBuilder, (uint)(strBuilder.Capacity)))
                     return;
                 fnFileFound(strBuilder.ToString());

                 handle2 = GCHandle.Alloc(hMods, GCHandleType.Pinned);
                 var uiSize = (uint)(Marshal.SizeOf(typeof(IntPtr)) * (hMods.Length));
                 var flag = EnumProcessModulesEx(processHandler, handle2.AddrOfPinnedObject(), uiSize, ref needed, LIST_MODULES_ALL);
                  if (flag != 0)
                  {
                        var uiTotalNumberofModules = needed / (Marshal.SizeOf(typeof(IntPtr)));
                        for (var i = 0; i < uiTotalNumberofModules; i++)
                        {
                              GetModuleFileNameEx(processHandler, hMods[i], strBuilder, (uint)(strBuilder.Capacity));
                              fnFileFound(strBuilder.ToString());
                              if (!Active)
                                  break;
                   }
               }
          }
          finally
          {
                if (handle2.IsAllocated)
                    handle2.Free();
           }
    }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
freeExec
@freeExec
Участник OpenStreetMap
Нет никакого API, надо писать свой драйвер. Чтобы не изобретать велосипед проще воспользоваться выводом данный утилиты.
https://docs.microsoft.com/en-us/sysinternals/down...
Ответ написан
HemulGM
@HemulGM
Delphi Developer, сис. админ
Ещё можно попробовать получить эту информацию через WMI.

Через WinAPI посмотри тут. Тут код на Delphi, но все методы API будут идентичны
https://fooobar.com/questions/12491810/delphi-gett...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы