Получить имя файла по процессу
Я пытаюсь получить имя файла текущего процесса.
То есть: если у меня есть файл "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");
Примеры имен файлов:
- "Config.ini"
- "Readme.txt"
- "Без названия"
Используя эти имена файлов, вы можете рекурсивно искать каталог, если у вас есть общее представление о том, где он находится, однако я бы предостерегал о таких дорогих вызовах
Это может быть возможно, но вам действительно нужно посмотреть на взаимодействие, чтобы узнать, какой именно файл открыт в Блокноте.
Вы можете получить много общей информации о процессах из.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#?