2017-02-01 1 views
-1

Ich versuche das Verzeichnis mit Java Code zu löschen, Jetzt Anwendungsfall ist: Wenn die Datei bereits geöffnet ist, sollte sie zuerst geschlossen werden, und dann kann ich das Verzeichnis direkt löschen.Nicht in der Lage, bereits geöffnete .xls Datei zu löschen und zu löschen 'java code

Ich habe versucht, die Datei mit Fileoutputstream zu schließen, aber ich bin nicht in der Lage Gegenstand von Fileoutputstream zu machen, zeigen Fehler wie „Der Prozess kann nicht die Datei zugreifen, da sie von einem anderen Prozess verwendet werden“

Gibt es eine andere Methode, die mir helfen wird?

+0

fügen Sie Ihr Code-Snippet, –

+0

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. –

+0

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. –

Antwort

0

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.

+0

Der Anwendungsfall ist, dass ich eine Ordnerstruktur erstelle, in der ich versuche, Excel-Dateien zu erstellen. Wenn der Benutzer zum zweiten Mal versucht, den Code erneut auszuführen, muss der vorherige Ordner gelöscht werden. Wenn jedoch einige der Excel-Dateien bereits vom Benutzer geöffnet wurden, können wir das vorhandene Verzeichnis nicht löschen. Die Datei kann nicht durch den Code selbst geschlossen werden. Wir sollten dem Benutzer eine Warnung geben, dass er die Datei zuerst schließt. Und lassen Sie den Benutzer zuerst die Abschlussarbeit erledigen. Ist es eine einzige Lösung oder gibt es noch etwas? – Shriram

+0

Ich sehe ... In Ihrem speziellen Fall wollen Sie definitiv die Benutzer zuerst ihre jeweiligen Dateien schließen (um höflich zu sein). Das einzige, was ich mir in diesem Fall vorstellen kann, ist, einen zusätzlichen Thread mit einem Timer zu erstellen, um kontinuierlich zu versuchen, die Ordner zu löschen und absichtlich die Ausnahme zu fangen und zu ignorieren. Wenn der Erfolg eintritt, können Sie eine Nachricht auf Ihrem Bildschirm anzeigen lassen, nachdem der Timer gestoppt und der Thread beendet wurde. – DevilsHnd

+0

Ja. Vielen Dank :) – Shriram

Verwandte Themen