2009-11-19 18 views
8

Sono nuovo qui, quindi non ho il tempo di contribuire prima di chiedere l'aiuto di voi ragazzi, quindi perdonatemi per quello.Come sapere quale file viene aperto da un'applicazione in qualsiasi momento?

Non sono sicuro se questo può essere fatto, ma mi piacerebbe scoprire i file aperti di un'applicazione.

Qui non mi riferisco ai file "interni" aperti, ma sono quelli aperti dall'utente finale (invocando l'app di gestione tramite file-assoc o esplicitamente all'interno dell'app). Pensa ai file * .cs o * .vb in Visual Studio (si, sono un ragazzo MS) o ai file di testo nel Blocco note.

Ho esaminato i "verbi" nel documento MSDN Win Shell, ma menziona solo il richiamo e nessun modo per controllare le informazioni dei verbi invocati. Ho anche guardato DDE, ma sembra una struttura per scopi generali e non si adatta al mio caso qui.

Devo dire che la mia situazione è difficile da risolvere da usare Google a causa della mancanza di parole chiave uniche, quindi questo sicuramente ha bisogno di attenzione umana :)

Grazie

+0

Benvenuti a SO.Hai il controllo dell'applicazione (cioè la stai sviluppando) o è un'applicazione chiusa che vuoi ispezionare? –

+0

In che modo lo strumento "monitor" è in grado di distinguere tra i file aperti dall'applicazione oi file aperti dall'utente dell'applicazione? Non penso sia possibile come descritto. – Lazarus

+0

Bene, ho guardato "Delphi - ottieni i file che vengono aperti da un'applicazione", menziona usando l'API proc NtQuerySystemInformation(), ma ho guardato i documenti, è una funzione interna del sistema operativo, e io sono non so se è bello usare C'è anche un'app prototipo WalkObject, ma poi devo masticare tutte le linee del codice sorgente, e preferisco non passare attraverso il dolore di leggerle ... BTW, sono uno sviluppatore C#, P/Invoke è anche ok per me –

risposta

3

Se si vuole ispezionare un processo in esecuzione per le maniglie aperte, è possibile utilizzare ProcessExplorer o l'applicazione della riga di comando Handle.

ProcessExplorer è essenzialmente il Monitor attività di Windows sugli steroidi. È uno strumento molto utile nell'elaborazione quotidiana e nel debug del processo. Lo consiglio vivamente.

+0

Penso che la sfida qui sia che vuole che solo i file aperti dall'utente utilizzino il software, non tutti i file avviati dall'applicazione si aprano, cioè .docx not dll, temp file, ecc. – Lazarus

+0

Puoi filtrare per quei requisiti in Process Explorer . –

0

esiste un'utility si trovano in SysInternals che possono elencare i file aperti da un'applicazione Link qui

+0

PsFile sarebbe quello che stai cercando – t0mm13b

+0

Grazie, ma mi piacerebbe farlo in modo programmatico, quindi questo potrebbe non essere lo strumento giusto per me –

0

uno veloce che funziona solo per il file-locking è un'estensione della shell chiamato WhoLockMe. Non è potente come alcuni degli altri strumenti qui, ma è un menu contestuale in Windows Explorer.

1

Suppongo che tu sia un programmatore C# e desideri del codice per farlo. Per quanto ne so, non esiste un'API di programmazione semplice per scoprire queste informazioni: non è l'API Win32, ma l'API interna di Windows. Tuttavia, la suite SysInternals di utilità della riga di comando (http://technet.microsoft.com/en-us/sysinternals/bb842062.aspx) può essere utilizzata per scoprire queste informazioni.

L'applicazione desiderata si chiama Handle.

Non ci saranno differenze nel sistema operativo tra quelli che chiamate "file interni" (presumibilmente quelli aperti dal programma senza il coinvolgimento dell'utente) e quelli che l'utente ha deliberatamente utilizzato. Dovrai fornire queste informazioni specificando l'estensione del file. Ad esempio, se si desidera trovare tutti i file word aperti in Word, la riga di comando di cui si necessita è:

handle -p winword.exe | trovare ".doc"

Se la scrittura di un applicazione in C#, è possibile utilizzare la seguente classe per restituire un elenco di documenti aperti che corrispondono alla vostra modello (nota che questo contiene un modulo chiamato ShowOpenAppFilesForm, con due caselle di testo appExeNameTextBox e fileExtensionTextBox, e una casella di riepilogo 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; 
    } 
} 
} 

[per inciso, DDE è in gran parte brindisi ora.]

Problemi correlati