Получить имя файла по процессу

Я пытаюсь получить имя файла текущего процесса.

То есть: если у меня есть файл "test.txt", открытый в блокноте, мне нужно получить что-то вроде "c: \ folder \ test.txt"

Приведенный ниже код возвращает информацию о процессе, включая путь к программному обеспечению. (например: "c:\windows\system32\notepad.exe").

[DllImport("user32.dll", EntryPoint = "GetForegroundWindow", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
public static extern int GetForegroundWindow();

[...]

public static string GetFilePathName()
{
    uint procId = 0;
    int hWnd = GetForegroundWindow();
    GetWindowThreadProcessId(hWnd, out procId);
    var proc = Process.GetProcessById((int)procId);
}

Можно ли использовать этот класс процессов для получения открытого имени файла / пути, который обрабатывает текущий процесс?

2 ответа

В C# у меня есть следующее решение. Я написал это, чтобы определить открытые файлы в Notepad.exe для вызова Kill().

Ваше решение будет зависеть от заголовка окна, в этом случае я мог бы ожидать, что форматирование в Блокноте будет "Без названия - Блокнот", "config.ini - Блокнот", "readme.txt - Блокнот" и т. Д., Где я бы разделил на char '-' и обрезать пробел.

public static void getFileNameByProcess(string process)
{
    foreach (Process p in Process.GetProcessesByName(process))
    {
        string[] split = p.MainWindowTitle.Split('-');
        if (split.Length > 0)
            Console.WriteLine("\"" + split[0].Trim() + "\"");
    }
}

Используйте это так: getFileNameByProcess("Notepad");

Примеры имен файлов:

  1. "Config.ini"
  2. "Readme.txt"
  3. "Без названия"

Используя эти имена файлов, вы можете рекурсивно искать каталог, если у вас есть общее представление о том, где он находится, однако я бы предостерегал о таких дорогих вызовах

Это может быть возможно, но вам действительно нужно посмотреть на взаимодействие, чтобы узнать, какой именно файл открыт в Блокноте.

Вы можете получить много общей информации о процессах из.NET, используя класс System.Diagnostics.Process, который является довольно мощным.

https://msdn.microsoft.com/en-us/library/z3w4xdc9%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396

Например, чтобы запустить все процессы блокнота на вашем компьютере.

Process[] notepads = Process.GetProcessesByName("notepad");

Вы можете получить библиотеку, которая делает это тоже:

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

Другие вопросы по тегам