我是新来的,所以在我请求你们的帮助之前我没有时间做出贡献,所以请原谅我。
我不确定是否可以这样做,但我想查找应用程序的已打开文件。
这里我不是指“内部”打开的文件,而是那些由最终用户打开的文件(通过文件关联调用处理应用程序,或者在应用程序内部明确调用)。想想Visual Studio中的* .cs或* .vb文件(是的,我是MS家伙)或记事本中的文本文件。
我在Win Shell MSDN文档中查看了“动词”,但它只提到了调用,而无法检查被调用动词的信息。我也看过DDE,但它看起来像是一个通用设施,并不符合我的情况。
我不得不说Googling很难解决我的情况,因为缺乏独特的关键词,所以这肯定需要人的关注:)
由于
答案 0 :(得分:3)
如果要检查正在运行的进程以查找打开的句柄,可以使用ProcessExplorer或命令行应用程序Handle。
ProcessExplorer本质上是类固醇的Windows任务监视器。它是日常计算和流程调试中非常有用的工具。我强烈推荐它。
答案 1 :(得分:1)
我假设您是C#程序员,并且想要一些代码来执行此操作。据我所知,没有简单的编程API来查找这些信息 - 它不是Win32 API,而是Windows内部API。但是,可以使用SysInternals命令行实用程序套件(http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx)来查找此信息。
您想要的应用程序称为句柄。
在您称之为“内部文件”(可能是程序在没有用户参与的情况下打开的内容)和用户故意使用的内容之间,操作系统没有任何差异。您必须通过指定文件的扩展名来提供此信息。例如,如果要查找在Word中打开的所有单词文件,则需要的命令行是:
handle -p winword.exe |找到“.doc”
如果在C#中编写应用程序,您可以使用以下类返回与您的模式匹配的打开文档列表(请注意,这包含一个名为ShowOpenAppFilesForm的表单,其中包含两个文本框 appExeNameTextBox 和< strong> fileExtensionTextBox ,列表框 openFileListBox ):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
namespace ShowOpenAppFiles
{
public partial class ShowOpenAppFilesForm : Form
{
private const string HandlePath = @"D:\Development\SysInternals\SysinternalsSuite\Handle.exe";
public ShowOpenAppFilesForm()
{
InitializeComponent();
}
private void showButton_Click(object sender, EventArgs e)
{
string[] fileExtensions = new string[1];
fileExtensions[0] = fileExtensionTextBox.Text;
openFileListBox.DataSource = Show(appExeNameTextBox.Text, fileExtensions);
}
private List<string> Show(string programExeName, string[] fileExtensions)
{
Process childProcess = new Process();
ProcessStartInfo startInfo = childProcess.StartInfo;
startInfo.FileName = HandlePath;
startInfo.Arguments = " -p " + programExeName;
startInfo.CreateNoWindow =false;
startInfo.ErrorDialog = false;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
childProcess.Start();
StreamReader stdOutput = childProcess.StandardOutput;
List<string> fileNameList = new List<string>();
while (!stdOutput.EndOfStream)
{
string line = stdOutput.ReadLine();
for (int i = 0; i < fileExtensions.Length; i++)
{
if (line.Contains("." + fileExtensions[i]))
{
fileNameList.Add(line.Substring(21));
}
}
}
childProcess.WaitForExit();
return fileNameList;
}
}
}
[顺便提一下,DDE现在主要是吐司。]
答案 2 :(得分:0)
在SysInternals中有一个实用程序可以列出应用程序Link打开的文件
答案 3 :(得分:0)
仅适用于文件锁定的快速方法是名为WhoLockMe的shell扩展。它不像其他一些工具那么强大,但它是Windows资源管理器中的上下文菜单。