【问题标题】:Get filename by process按进程获取文件名
【发布时间】:2015-05-07 23:02:38
【问题描述】:

我正在尝试检索当前进程的文件名。

ie:如果我在记事本中打开了文件“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);
}

是否可以使用这个进程类来实现当前进程正在处理的打开文件名/路径?

【问题讨论】:

标签: c# kernel32 ntdll


【解决方案1】:

在 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. “无标题”

使用这些文件名,如果您对目录的位置有一个大致的了解,您可以递归搜索目录,但是我会提醒像这样的昂贵调用

【讨论】:

    【解决方案2】:

    这可能是可能的,但您必须真正查看一些互操作性才能找出在记事本中打开了哪个特定文件。

    您可以使用非常强大的 System.Diagnostics.Process 类从 .NET 中获取大量通用​​进程信息。

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

    例如让所有记事本进程在您的机器上运行。

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

    您也许也可以获得一个这样做的库:

    How do I get the list of open file handles by process in C#?

    【讨论】:

    • 请注意,许多“打开”文件的程序不会锁定它 - 我相信记事本不会锁定文件,而是简单地读取它......
    • @Alexei 是正确的,当您将文件加载到记事本时,它会将整个文件读入内存并关闭文件,它不会保留文件的打开句柄。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 2023-03-22
    • 2017-07-18
    相关资源
    最近更新 更多