tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
595
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cannily Cannily ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    7
    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:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    
    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
     

  2. #2
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    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.
     

  3. #3
    Cannily Cannily ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    7
    Ja stimmt du hast recht.
    Code java:
    1
    
    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:
    Code java:
    1
    
    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:
    Code java:
    1
    
    new File("").getCanonicalPath().split(Pattern.quote(File.separator));
    Quelle
    Geändert von Cannily (17.02.11 um 22:45 Uhr) Grund: Verbesserung
     

  4. #4
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    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
     

  5. #5
    Cannily Cannily ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    7
    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:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    
    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
     

  6. #6
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    Keine ahnung ob das kopieren klappt, ich denke schon, ABER
    du führst die kopie nicht aus, sondern immernoch noch das original...
     

  7. #7
    Cannily Cannily ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    7
    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.
     

  8. #8
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    erzeuge ein fileobject von deiner jar die auch gelöscht werden soll und führ die methode aus:

    Code :
    1
    
    DEINFILE.deleteOnExit()
     

  9. #9
    Cannily Cannily ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    7
    Juhu fast geschafft, danke

    Ich habe deinen Vorschlag gleich mal eingebaut und den exec Befehl funktionierend gemacht:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
     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)...
     

  10. #10
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    ja, dort könntest du es auch mit deleteOnExit() machen
     

  11. #11
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    ich bin mir allerdings nicht sicher ob das wirklich möglich ist,
    weil ->> wenn auf eine datei in einem ordner zugegriffen wird, kannst du den ordner nicht löschen... wie gesagt bin mir nicht sicher ob das so möglich ist... sonst ist es wahrscheinlich nur von außen möglich, alles perfekt zu löschen, einfach mal testen =)
     

  12. #12
    Cannily Cannily ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    7
    Eigentlich soll es ja von außen gelöscht werden.
    Code java:
    1
    2
    3
    
     String pfad = System.getenv("Temp") + File.separator + prog +".jar \"" + pfad(pfad(name)) + "\"";
            String cmd[] = { "cmd.exe", "/c", pfad };
            Runtime.getRuntime().exec(cmd);
    übergibt ja der neu erstellten Jar Datei im Temp Ordner den Befehl pfad(pfad(name)) // Also den absoluten Pfad zu den zu löschenden Ordnern. Und das klappt ja auch, da die jar Datei gelöscht wird. Wenn ich die Temp-Jar Datei nochmal rüberlaufen lassen, nachdem die jar datei gelöscht wurde, passiert jedoch nichts.
    Das mit dem deleteOnExit() funktionierte leider nicht.
     

  13. #13
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    wenn du, nach dem es soweit alles ausgeführt hast, bei den ordern auf eigenschaften gehst, sind diese dann 0byte groß? müssten sie, wenn nicht, ist da noch irgendwo eine datei versteckt... was anderes fällt mir atm nicht ein
     

  14. #14
    Cannily Cannily ist offline Rookie
    Registriert seit
    Feb 2011
    Beiträge
    7
    Also ich hab jetzt 2 Lösungen für das Problem:

    1. Die ist etwas frustrierend, aber es ging ja mehr oder wenig darum, dass das Programm in Java geschrieben ist...: Wenn die Temp Jar folgenden Code im cmd ausführt wird alles ohne Rückfrage gelöscht:
    Code java:
    1
    2
    3
    
    cmd = "rd /S/Q \"" + pfad(pfad(name)) + "\"";
    // Sollte folgendermaßen aussehen:
    rd /S/Q "c:/Program Files (x86)/CT Projekt"

    2. Wenn die Temp Datei aus dem cmd angewählt wird, schafft sie es alles zu löschen.
    Wie genau der Code aussieht werd ich jetzt mal schauen und hier posten

    Nochmals Danke für deine Hilfe
     

  15. #15
    Maik639 Maik639 ist offline Mitglied Gold
    Registriert seit
    Nov 2010
    Beiträge
    132
    vllt. weil die jar doch noch läuft... nach dem starten der tempjar einfach system.exit(-3); bei der jar im ctprojete ordner ausführen
     

Ähnliche Themen

  1. c# txt schreiben
    Von xlon im Forum .NET Windows Forms
    Antworten: 9
    Letzter Beitrag: 16.07.09, 09:56
  2. Antworten: 1
    Letzter Beitrag: 03.12.06, 15:39
  3. SMS Schreiben
    Von DelphiDell im Forum Hosting & Webserver
    Antworten: 2
    Letzter Beitrag: 17.01.06, 21:55
  4. Antworten: 4
    Letzter Beitrag: 25.04.05, 22:15
  5. schreiben
    Von Pilldriver im Forum 3D Studio Max
    Antworten: 14
    Letzter Beitrag: 16.03.02, 23:33

Stichworte