Geöffnete Dateien in Windows erkennen

Hallo,

ich möchte in Windows auslesen, welche Dateien geöffnet sind.
Da der TaskManager mir die Information liefert habe ich es über den folgende Befehl versucht.
new ProcessBuilder("cmd", "/c", "tasklist");

Leider gibt mir jedoch tasklist nur die Programme aus.
Also zum Beispiel in MS-Word steht dort nur “WINWORD.EXE” aber nicht wie in folgendem Bild, die einzelnen Dateien.

Kennt jemand eine Möglichkeit in Windows die Information der geöffneten Dateien oder der Prozesse inkl. Details auszulesen?

Vielen Dank im Voraus

Du siehst im Taskmanager nicht die geöffneten Dateien, sondern die Prozesse und deren Titel. Über tasklist bekommst du die PID (Prozess ID), welche du aber afair dafür nutzen kannst, über die WINAPI an das Handle zu kommen und damit solltest du dann den Titel auszulesen können.

Edit: ach ja, dass wird aber mit Java an sich nicht möglich sein. Dafür wirst du dann schon auf JNI oder JNA zurückgreifen müssen.

[quote=whitetea]Kennt jemand eine Möglichkeit in Windows die Information der geöffneten Dateien oder der Prozesse inkl. Details auszulesen?[/quote]SysInternals ProgExp

bye
TT

Hallo Tomate_Salat,

danke für deine Antwort, der Weg war der richtige Ansatz. Ich habe auf JNA zurückgegriffen und die Lösung ist folgende.
Um zu prüfen ob die Dateien, welche ich aus meiner Application geöffnet habe, noch geöffnet sind, nehme ich
erst den Rückgabewert vom Processbuilder und überwache Ihn mit p.wait().
Dies ist notwendig, da Windows nicht bei allen Anwendungen immer ein neues Fenster aufmacht (z.B. wenn nur ein Tab geöffnet wird).

Bei Office-Datei bricht der Process jedoch beim Öffnen der zweiten gleichen Datei(z.B. zwei Word Dateien) direkt ab, da keine neue Instanz erstellt wird, sondern diese an Office übergeben wird.

In diesem Fall hole ich mir alle Fenster und deren Titel mit folgendem Code.

        HashMap<Integer, String> map = new HashMap<>();
        final User32 user32 = User32.INSTANCE;
        user32.EnumWindows(new WNDENUMPROC() {
            int count = 0;

            @Override
            public boolean callback(HWND hWnd, Pointer arg1) {
                byte[] windowText = new byte[512];
                user32.GetWindowTextA(hWnd, windowText, 512);
                String wText = Native.toString(windowText, "ISO-8859-1");
                 if (wText.isEmpty()) {
                    return true;
                }

                map.put(++count, wText);
                return true;
            }
        }, null);
        return map;
    }```

In der HashMap steht dann der Titel der Fenster, welche auch den Dateinamen ohne Extension enthalten. 
Diese Dateienamen prüfe ich dann mit dem gesuchten Dateinamen ab.

```  public static Boolean checkOpenFile(String filenameIn, Daten daten) {
        HashMap<Integer,String> map = getOpenWindows(daten);
        filenameIn = getFileNameWithoutExt(filenameIn);
        Boolean check = false;
        ArrayList<Integer> aList = new ArrayList<>(map.keySet());
        for (Integer key : aList) {
            if (map.get(key).contains(filenameIn)) {
                check = true;
                break;
            }
        }
        return check;
    }
  public static String getFileNameWithoutExt(String dateiName) {
        String extension = "";
//Die Extention der datei wird gefiltert
        int i = dateiName.lastIndexOf('.');
        int p = Math.max(dateiName.lastIndexOf('/'), dateiName.lastIndexOf('\\'));
        if (i > p) {
            extension = dateiName.substring(i + 1);
        }

        dateiName = dateiName.replace("." + extension, "");
        return dateiName;

    }

Der Rückgabewert von checkOpenFile ist solange true, wie die Datei geöffnet ist.

Viele Grüße

Wieder mal so ein Thema was man eigentlich unter “Für so einen Unsinn ist Java einfach die falsche Sprache.” packen könnte.

Um es kurz zu machen : über die WIN-API wird man sicher etwas ähnliches wie “lsof” unter Unix basteln können, aber nicht mit Java (und wenn dann würde Java nur die GUI bilden, alles weitere müsste über JNA/JNI auf C abgebildet werden ~ und das gibt es zu genüge … warum das Rad neu erfinden wollen ?).