Wenn die Datei, die Sie löschen möchten, von Ihrer Java-Anwendung möglicherweise mit der Methode Runtime.getRuntime() .exec() geöffnet wurde, muss diese Datei geschlossen werden, bevor Sie können Führen Sie die Aufgabe aus. Und da die Datei geöffnet ist, können Sie natürlich auch den Home-Ordner (Verzeichnis) dieser Datei nicht löschen, die Datei muss zuerst geschlossen werden. Dies ist eine Betriebssystem-Schutzmaßnahme, die völlig Sinn ergibt. Warum sollten wir etwas löschen wollen, das von etwas anderem verwendet wird?
Um die Datei zu schließen, müssen Sie den Namen des Prozesses kennen, die sie verwendet, wenn beispielsweise eine Textdatei mit dem Namen MyText.txt hat Sie MS Windows NotePad.exe dann geöffnet muss den NotePad.exe Prozess schließen, der die Datei MyText.txt geöffnet hält.
Im Folgenden stelle ich eine einfache Methode vor, die einen offenen externen Prozess für Sie schließen kann, indem Sie den richtigen Prozessnamen angeben. Von unserem obigen Beispiel dieser „Notepad.exe“ sein würde, werden
public static void killProcess(String processName) {
// PLEASE NOTE: This method will currently Kill "ALL"
// open processes of the supplied process
// name unless commented code changes are
// made.
try {
Runtime rt = Runtime.getRuntime();
// For Windows OS...
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
rt.exec("taskkill /T /F /IM " + processName);
//rt.exec("taskkill /T /F /PID " + Long.parseLong(processName)); // Supply the PID value as string
//rt.exec("taskkill /F /FI \"WINDOWTITLE eq " + processName + "\" /T"); // Supply the window title bar text.
// If you want to kill only a single instance of the
// named process then get its PID value and use:
// "taskkill /T /F /PID PID_Value" OR you can provide
// the window title and use:
// "taskkill /F /FI \"WINDOWTITLE eq " + processName + "\" /T"
}
// For OSX And Linux OS's...
else {
rt.exec("sudo killall -9 '" + processName + "'");
//rt.exec("kill -9 " + Long.parseLong(processName)); // Supply the PID value as string
// If you want to kill only a single instance of the
// named process then get its PID value and use:
// "kill -9 PID_Value"
}
rt.freeMemory();
}
catch (IOException | SecurityException | IllegalArgumentException ex) {
ex.printStackTrace();
}
}
Als Kommentare Zustand zu Beginn dieses Verfahrens Code, ALLE aktuell laufenden Prozesse des gelieferten Prozessnamen beendet werden. Wenn Sie nur eine bestimmte Instanz eines Prozesses beenden möchten, wie in unserem Beispiel oben, und Sie vier andere Instanzen von Notepad.exe öffnen, um andere Textdateien zu bearbeiten, müssen Sie den Methodencode wie folgt ändern:
rt.exec("taskkill /F /FI \"WINDOWTITLE eq " + processName + "\" /T");
statt dessen:
rt.exec("taskkill /T /F /IM " + processName);
und natürlich würden Sie diese Methode so etwas wie dieses nennen:
killProcess("MyText.txt - Notepad");
wo Sie liefern, was in der Fenster Titelleiste der Anwendung. Sobald die obige Methode abgeschlossen ist, können Sie die Datei MyText.txt und den Ordner löschen, in dem sie sich befindet, da sie nicht mehr verwendet wird.
fügen Sie Ihr Code-Snippet, –
Nein - wenn ein anderer Prozess eine Datei geöffnet hat (unter Windows, die Ihre Plattform gegeben ist Ihre Fehlermeldung als Linux kümmert sich nicht, dass ein anderer Prozess eine Datei geöffnet hat) können Sie nichts dagegen tun das von Java. Sie müssen Windows-spezifische Tools verwenden, um festzustellen, welcher Prozess geöffnet ist, und diesen Prozess automatisch schließen, wenn Sie dies wünschen. –
Dieser Ansatz wird nicht funktionieren. Sie versuchen, ein neues Dateihandle zu öffnen, und Sie können nur dieses schließen. Das vorhandene Dateihandle bleibt weiterhin geöffnet. –