我试图检索当前进程的文件名。
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);
}
是否可以使用此Process Class来实现当前进程正在处理的已打开文件名/路径?
答案 0 :(得分:0)
这可能是可能的,但您必须真正查看某些互操作以找出在记事本中打开的特定文件。
您可以使用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#?
答案 1 :(得分:0)
在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");
示例文件名:
使用这些文件名,你可以递归搜索一个目录,如果你对它的位置有一个大概的了解,那么我会提醒像这样的昂贵的电话