Deinstallationsprogramm schreiben

Cannily

Grünschnabel
Hallo, ich habe ein Programm, dass sich standartmäßig in den Ordner C://Programme/CT Projekt/Black Jack schreibt. Nun wollte ich ein deinstallationsprogramm schreiben, dass den Ordner, CT Projekt, wenn er nur einen weiteren Ordner enthält (Black Jack) löscht, bzw. den Ordner Black Jack, falls es nicht so sein sollte:

Java:
import java.io.File;

import javax.swing.*;

public class Deinstallation{
	
	private String[] liste;
	private String pfad;
	
	public Deinstallation(String name) {
		pfad = this.getClass().getResource("").toString();
		pfad = pfad.substring(6);
		liste = pfad.split("/");
		File[] file = new File(pfad(pfad(name))).listFiles();
		if(file.length == 1) {
			loesche(new File(pfad(pfad(name))));
			JOptionPane.showMessageDialog(null, "Deinstallation erfolgreich!");
		}
		else JOptionPane.showMessageDialog(null, "Deinstallation hat leider nicht geklappt!");
	}		
	
	private String pfad(int laenge) {
		String pfad = "";
		for(int i = 0; i != laenge; i++) {
			pfad = pfad + liste[i]+ "/";
		}
		pfad = pfad + liste[laenge];
		return pfad;
	}
	
	private int pfad(String dir) {
		int z = 0;
			
		for(int i = 0; i != liste.length; i++) {
			if(liste[i].contains(dir)) {
				z = i;
			}
		}
		return z;
	}
	
	private void loesche(File dir){
		if (dir.isDirectory()){
			File[] files = dir.listFiles();
			for (File aktFile: files){
				loesche(aktFile);
			}
		}
		dir.delete();
	}
	
	public static void main(String[] args) {
		new Deinstallation("CT");
		new Deinstallation("Jack");
	}

}

Nun funktioniert das Programm in Eclipse wunderbar, aber bei einem "Feldversuch" passiert nichts...

Kann mir einer erklären was ich falsch mache?

Vielen Dank
 
Hallo,

ich hatte sowas auch mal, ist aber schon recht lange her,
mein tipp:

erstelle beim aufrufen des programms einen dialog der dir den pfad als text anzeigt,
das wird vermutlich der fehler sein, wenn es denn in eclipse läuft.
Warum? weil du ja dann eine gepackte datei hast, und dort der pfad anders ist.
 
Ja stimmt du hast recht.
Java:
pfad = this.getClass().getResource("").toString();
funktioniert nicht in der .jar Datei...

Manchmal ist ein Problem einfach zu offensichtlich um es selbst zu finden :)
Danke für die Hilfe.

Ich habe ein wenig gegoogled und bin auf eine Lösung gestoßen:
Java:
new File("").getAbsolutePath()
Vielleicht hilft die Lösung ja jemandem der vor dem selben Problem steht.

Quelle
(Ich hoffe der Link ist erlaubt)

Verbesserung:
Mit diesem Code sollte auch das Programm besser funktionieren:
Java:
new File("").getCanonicalPath().split(Pattern.quote(File.separator));
Quelle
 
Zuletzt bearbeitet:
hi,
Freut mich das dein problem gelöst wurde =) ich brauchte es mal um was aus ner jar auszulesen, ich sag dir das war ein kampf und am ende ist mir eine schlauere lösung eingefallen^^ und mir ist aufgefallen das oben geschriebene "vor recht langer zeit" ist ca. 4wochen her...manchmal vergeht die zeit doch langsam...
Mfg maik
 
Es geht leider doch noch nicht...

Ich habe jetzt das Programm überarbeitet, und zwar wird ein Abbild meines deistallers in das Temp Verzeichnis von Windows gepackt. Von dort soll es gestartet werden um das Original mit samt der dazugehörigen Ordner zu löschen:
Java:
package deinstallation;

import java.io.*;
import java.util.regex.Pattern;

import javax.swing.*;

public class Deinstallation{
	
	private String[] liste;
	private String cmd;
	
	private final static String prog = "deinstallation";
	
	public Deinstallation(String name) throws Exception {
		JOptionPane.showMessageDialog(null, "Das Programm wird nun deinstalliert");
		temp();
		liste = new File("").getCanonicalPath().split(Pattern.quote(File.separator));
		cmd = "cmd cd " + System.getenv("Temp") + File.separator + "java -jar "+ prog +".jar " + pfad(pfad(name));
		Runtime.getRuntime().exec(cmd);
		System.exit(0);
	}

	private void temp() throws Exception {
	    FileInputStream datei = new FileInputStream(new File("").getCanonicalPath() + File.separator + prog + ".jar");	
	    
	    FileOutputStream temp = new FileOutputStream(System.getenv("Temp") + File.separator + prog + ".jar");
	
	    copy(datei, temp);
	 
	    datei.close();
	    temp.close();
	}
	
	private void copy(InputStream in, OutputStream out) throws Exception	{
		int length;
	    byte[] buffer = new byte[8192];
	 
	    while ((length = in.read(buffer)) != -1)	{
	      out.write(buffer, 0, length);
	    }
	}

	private String pfad(int laenge) {
		String pfad = "";
		for(int i = 0; i != laenge; i++) {
			pfad = pfad + liste[i]+ File.separator;
		}
		pfad = pfad + liste[laenge];
		return pfad;
	}
	
	private int pfad(String dir) {
		int z = 0;
			
		for(int i = 0; i != liste.length; i++) {
			if(liste[i].contains(dir)) {
				z = i;
			}
		}
		return z;
	}
	
	private static void loesche(File dir){
		if (dir.isDirectory()){
			File[] files = dir.listFiles();
			for (File aktFile: files){
				loesche(aktFile);
			}
		}
		dir.delete();
	}
	
	public static void main(String[] args) throws Exception {
		try {
			System.out.println(args[0]);
			loesche(new File(args[0]));
		}
		catch (Exception e) {
			System.out.println("catch");
			new Deinstallation("CT");
		}
	}

}

Leider funktioniert das nicht, und ich weiß schon wieder nicht warum :(
 
Keine ahnung ob das kopieren klappt, ich denke schon, ABER
du führst die kopie nicht aus, sondern immernoch noch das original...
 
hmm... ich schließe doch das main Programm, und führe dann die .jar im Temp folder aus...
Ich bin glaube ich aber schon auf das Problem gekommen: Bei einem Test habe ich festgestellt, dass die Methode loesche() keine jar Datein löschen kann. Das liegt vermutlich daran, dass dir.delete() nur funktioniert wenn das Verzeichnis leer ist, und jar als Verzeichnis angesehen wird. Das Programm wiederum kann jedoch keine Datein in der jar erreichen und somit das jar nicht leeren.

Ich habe (und finde) bloß keine Antwort, wie ich eine jar löschen kann um dieses Problem zu umgehen.
 
erzeuge ein fileobject von deiner jar die auch gelöscht werden soll und führ die methode aus:

Code:
DEINFILE.deleteOnExit()
 
Juhu fast geschafft, danke :)

Ich habe deinen Vorschlag gleich mal eingebaut und den exec Befehl funktionierend gemacht:
Java:
 public Deinstallation(String name) throws Exception {
        JOptionPane.showMessageDialog(null, "Das Programm wird nun deinstalliert");
        temp();
        liste = new File("").getCanonicalPath().split(Pattern.quote(File.separator));
        String pfad = System.getenv("Temp") + File.separator + prog +".jar \"" + pfad(pfad(name)) + "\"";
        String cmd[] = { "cmd.exe", "/c", pfad };
        Runtime.getRuntime().exec(cmd);
        System.exit(0);
    }

private static void loesche(File dir){
        if (dir.isDirectory()){
            File[] files = dir.listFiles();
            for (File aktFile: files){
            	if(aktFile.toString().contains(".jar")) {
            		aktFile.deleteOnExit();
            	}
            	else loesche(aktFile);
            }
        }
        dir.delete();
    }
Nun ist die jar Datei weg, jedoch, da das Programm sich erst schließt bevor es die jar Datei löscht, überleben die unterordner (CT Projekt/Black Jack/deinstall.jar -> CT Projekt/Black Jack)...
 
Zurück