2009-11-19 3 views
8

Ich bin neu hier, also habe ich nicht die Zeit, etwas beizutragen, bevor ich euch um Hilfe ersuche, also verzeiht mir dafür.Wie kann man wissen, welche Datei zu jeder Zeit von einer Anwendung geöffnet wird?

Ich bin nicht sicher, ob dies getan werden kann, aber ich würde gerne die geöffnete Datei (en) einer Anwendung herausfinden.

Hier meine ich nicht die "internen" geöffneten Dateien, sondern diejenigen, die vom Endbenutzer geöffnet werden (entweder durch Aufruf der Handling-App durch Dateiassoc oder explizit in der App). Denken Sie * .cs oder * .vb Dateien in Visual Studio (ja, ich bin ein MS-Typ) oder Textdateien im Editor.

Ich habe "Verben" in der Win Shell MSDN Dokument untersucht, aber es erwähnt nur das Aufrufen und keine Möglichkeit, Informationen von aufgerufenen Verben zu überprüfen. Ich schaute auch auf DDE, aber es sieht wie eine Allzweckeinrichtung aus und passt nicht in meinen Fall hier.

Ich muss sagen, dass meine Situation schwierig ist, durch googeln gelöst werden, weil der Mangel an eindeutigen Schlüsselwörter, so würde dies auf jeden Fall braucht die menschliche Aufmerksamkeit :)

Dank

+0

Willkommen bei SO.Haben Sie die Kontrolle über die Anwendung (d. H. Entwickeln Sie sie) oder ist es eine geschlossene Anwendung, die Sie überprüfen möchten? –

+0

Wie könnte das "Monitor" -Tool in der Lage sein, zwischen den von der Anwendung geöffneten Dateien oder den vom Benutzer der Anwendung geöffneten Dateien zu unterscheiden? Ich denke nicht, dass es wie beschrieben möglich ist. – Lazarus

+0

Nun, ich habe "Delphi - Get, welche Dateien von einer Anwendung geöffnet werden", es erwähnt die Verwendung der API proc NtQuerySystemInformation(), aber ich habe mir die Dokumente angesehen, es ist eine interne Funktion des Betriebssystems, und ich bin nicht sicher, ob es gut ist zu verwenden Es gibt auch eine WalkObject-Prototyp-App, aber dann muss ich alle Quellcode-Zeilen kauen, und ich ziehe es vor, nicht durch den Schmerz zu gehen sie zu lesen ... BTW, ich bin ein C# -Entwickler, P/Invoke ist auch ok für mich –

Antwort

3

Wenn Sie untersuchen möchten ein laufender Prozess für offene Handles, können Sie ProcessExplorer oder die Befehlszeilenanwendung Handle verwenden.

ProcessExplorer ist im Wesentlichen der Windows Task Monitor auf Steroiden. Es ist ein sehr nützliches Werkzeug im täglichen Computing sowie für das Debugging von Prozessen. Ich empfehle es sehr.

+0

Ich denke, die Herausforderung hier ist, dass er nur die Dateien durch den Benutzer mit der Software geöffnet werden soll keine Anwendung initiierte Datei öffnet, dh .docx nicht dll, temporäre Dateien usw. – Lazarus

+0

Sie können für diese Anforderungen in Process Explorer filtern . –

0

es ein Dienstprogramm in SysInternals gefunden ist, die die Dateien, die von einer Anwendung geöffnet Liste können Link hier

+0

PsFile wäre derjenige, den du suchst. – t0mm13b

+0

Danke, aber ich möchte das programmatisch machen, also ist das vielleicht nicht das richtige Werkzeug für mich –

0

A schnell eine, die nur für die Dateisichernd arbeitet, ist eine Shell-Erweiterung WhoLockMe genannt. Es ist nicht so leistungsstark wie einige der anderen Tools hier, aber es ist ein Kontextmenü im Windows Explorer.

1

Ich nehme an, dass Sie ein C# -Programmierer sind, und wollen etwas Code, um dies zu tun. Soweit ich weiß, gibt es keine einfache Programmier-API, um diese Informationen herauszufinden - es ist nicht die Win32-API, sondern die Windows-interne API. Die SysInternals-Suite von Befehlszeile-Dienstprogrammen (http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx) kann jedoch verwandt werden, um diese Information zu ermitteln.

Die gewünschte Anwendung heißt Handle.

Es gibt keine Unterschiede zum Betriebssystem zwischen dem, was Sie "interne Dateien" nennen (vermutlich solche, die vom Programm ohne Benutzereingriff geöffnet wurden) und solchen, die der Benutzer absichtlich verwendet hat. Sie müssen diese Information angeben, indem Sie die Erweiterung der Datei angeben. Wenn Sie beispielsweise alle Word-Dateien in Word suchen möchten, benötigen Sie folgende Befehlszeile:

handle -p winword.exe | finden „.doc“

Wenn eine App in C# zu schreiben, können Sie die folgende Klasse verwenden könnte eine Liste der geöffneten Dokumente zurückgegeben, der dem Muster entsprechen (beachten Sie, das ein Formular ShowOpenAppFilesForm, mit zwei Textfelder appExeNameTextBox genannt enthält und fileExtensionTextBox und ein Listenfeld 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; 
    } 
} 
} 

[Übrigens DDE ist meist jetzt Toast.]

Verwandte Themen