如何知道应用程序随时打开哪个文件?

时间:2009-11-19 16:16:42

标签: file

我是新来的,所以在我请求你们的帮助之前我没有时间做出贡献,所以请原谅我。

我不确定是否可以这样做,但我想查找应用程序的已打开文件。

这里我不是指“内部”打开的文件,而是那些由最终用户打开的文件(通过文件关联调用处理应用程序,或者在应用程序内部明确调用)。想想Visual Studio中的* .cs或* .vb文件(是的,我是MS家伙)或记事本中的文本文件。

我在Win Shell MSDN文档中查看了“动词”,但它只提到了调用,而无法检查被调用动词的信息。我也看过DDE,但它看起来像是一个通用设施,并不符合我的情况。

我不得不说Googling很难解决我的情况,因为缺乏独特的关键词,所以这肯定需要人的关注:)

由于

4 个答案:

答案 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资源管理器中的上下文菜单。