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

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

то есть: если у меня есть файл "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);
}

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


person Andre Felipe    schedule 07.05.2015    source источник
comment
Я думаю, вы могли бы сделать что-то вроде этого: stackoverflow.com/questions/864484/   -  person Nathan Tregillus    schedule 08.05.2015
comment
Я полагаю, вам нужны аргументы командной строки? stackoverflow.com/questions/504208/   -  person Arsen Mkrtchyan    schedule 08.05.2015
comment
Я отредактировал ваше название. См. Должны ли вопросы включать «теги» в свои заголовки?, где нет единого мнения, не следует.   -  person John Saunders    schedule 08.05.2015


Ответы (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. "Без названия"

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

person Tyler V    schedule 23.06.2016

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

Вы можете получить много общей информации о процессах из .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 #?

person garryp    schedule 07.05.2015
comment
Обратите внимание, что многие программы, открывающие файл, не блокируют его - и я считаю, что блокнот не блокирует файл, а просто читает его ... - person Alexei Levenkov; 08.05.2015
comment
@Alexei верен, когда вы загружаете файл в Блокнот, он считывает весь файл в память и закрывает файл, он не сохраняет открытый дескриптор файла. - person David Ching; 08.05.2015