Programm Idee

maGG

Bekanntes Mitglied
Folgende Situation: Man hat ein Ordner mit einigen Dateien drin und einige USB-Sticks die damit bespielt werden sollen. Auf jeden USB-Stick sollen die selben Daten drauf. Wenn man das per Hand macht dauert das ... länger.
Kann man mit Java da was machen?

Folgende Funktionen wären nützlich:
-eine Art Einlese Funktion, die sich merk welche Dateien dupliziert werden sollen.
-das Programm erkennt, wenn der USB-Stick angeschlossen wurde
-es bespielt den USB-Stick mit den Dateien
-es meldet den USB-Stick direkt wieder ab, so dass man ihn rausziehen kann

Ich hätte mir das so gedacht: Ich starte das Programm und alle neuen Festplatten, die dann in dieser Zeit angeschlossen werden werden bespielt und ausgeworfen.

Erst mal generell: Geht sowas überhaupt in Java? Und wenn ja, wie umfangreich würdet ihr so etwas einschätzen? Wenn ihr sagt, es wäre richtig aufwendig, dann lass ich es lieber mich einzulesen 😉
 
Zum USB-Stick: Da fällt mir nur ein sämtliche Laufwerke pollen und zum Beispiel eine bestimmt Datei suchen ?? Dann müsste man den Stick allerdings damit präparieren. Oder evtl. in der Windows-Registry nachschauen ?? Da gibt es doch bestimmt einträge zu einem USB-Stick. Aber das automatische Auswerfen ist nach wie vor ein Problem
 
Evtl. gibt es ein Windows Programm/Kommando mit dem du das Auswerfen anstossen kannst ? Falls ja könntest du zum Auswerfen einfach dies (oder eine passende .bat Datei) ausführen.
 
Erkennen, ob ein Drive dazukam ist möglich, z. B. sekündlich prüfen,
Dateien danach kopieren möglich,
Hilfsfenster, dass kopiert fertig ist, auch,
Drive auswerfen nicht(!)

Ich kann das ja mal schnell ausprobieren 🙂
 
Du meinst sowas:
Code:
       File[] roots = File.listRoots();
       for(int i=0;i<roots.length;i++)
            System.out.println("Root["+i+"]:" + roots[i]);
 

Ich stelle das einfach mal in den Raum:
Java:
    public static void main(String[] args) throws InterruptedException, IOException {
        File[] roots = File.listRoots();
        while (true) {
            Thread.sleep(1000);
            File[] rootss = File.listRoots();
            if (rootss.length > roots.length) {
                Thread.sleep(1000); /* Sicherheit.. */
                for (File file : rootss) {
                    if (!cont(roots, file)) {
                        Files.copy(Paths.get("a.gif"), Paths.get(file.toString() + "a.gif"), new CopyOption[0]);
                        if (JOptionPane.showConfirmDialog(null,
                                "a.gif wurde erfogreich kopiert nach: " + file
                                + "\n\nProgramm weiterhin laufen?") != JOptionPane.YES_OPTION) {
                            return;
                        }
                        return; /* (!) */
                    }
                }
            }
        }
    }

    static boolean cont(File[] roots, File file) {
        for (File root : roots) {
            if (file.equals(root)) {
                return true;
            }
        }
        return false;
    }

Funktioniert bereits, "a.gif" wird kopiert, sobald man den USB-Stick anschließt, aber an der Stelle mit (!) muss gewartet werden, bis der USB-Stick wieder abgeschlossen ist. 😉

Also, das ist ja jetzt keine Zauberei.

Zudem: Etwas machen, was der User nicht sieht, ist immer schlecht 🙁
 
Es hängt natürlich auch ein wenig davon ab, wie gut die Laufwerkserkennung funktionieren muß. Soll sie bei jedem hinzugefügten Laufwerk greifen oder nur wenn es wirklich ein USB-Stick ist (irgendeiner oder nur ausgewählte?)? Könnte vielleicht stören, wenn die Logik bei jeder eingelegten DVD, jedem eingedockten Smartphone oder gemappten Netzlaufwerk greift. Neulich musste ich sogar noch mal ein altes USB-Diskettenlaufwerk anschliessen.😉
 
Ja, deshalb die Idee mit dem präparierten USB-Stick auf dem eine ganz bestimmte Datei, evtl. mit ganz bestimmten Inhalt gesucht wird
 
Ok, ich habe mich nochmal ran gesetzt, leicht verändert sollte er das Programm so übernehmen können:
Java:
    public static void main(String[] args) throws InterruptedException, IOException {
        File[] roots = File.listRoots();
        while (true) {
            // pull...
            Thread.sleep(1000);
            File[] rootsNeu = File.listRoots();
            File file = getFile(roots, rootsNeu);
            if (file != null) {
                Thread.sleep(1000);//zur Sicherheit
                // kopieren...
                Files.copy(Paths.get("a.gif"), Paths.get(file.toString() + "a.gif"), new CopyOption[0]);
                // Statusmeldung + weiter... (?)
                if (JOptionPane.showConfirmDialog(null,
                              "a.gif wurde erfolgreich kopiert nach: " + file
                        + "\n\nJetzt Drive abschließen..."
                        + "\n\nProgramm weiterhin laufen?") != JOptionPane.YES_OPTION) {
                    return;
                }
                // warten...
                do {
                    Thread.sleep(1000);
                    rootsNeu = File.listRoots();
                } while (cont(rootsNeu, file));
            }
        }
    }

    static File getFile(File[] roots, File[] rootsNeu) {
        if (roots.length + 1 == rootsNeu.length) {
            for (File file : rootsNeu) {
                if (!cont(roots, file)) {
                    return file;
                }
            }
        }
        return null;
    }

    static boolean cont(File[] roots, File file) {
        for (File root : roots) {
            if (file.equals(root)) {
                return true;
            }
        }
        return false;
    }

Ich habe es auch ein paar Mal getestet. Es funktioniert. Nach dem kopieren wartet es, bis der USB-Stick wieder abgeschlossen wurde. Bei kleinstem Fehler,bricht das Programm ab.

"Sicher entfernen": Die meisten USBs haben eine LED, wenn die nicht mehr "wild" leuchtet/blinkt, dann kann er auch einfach so,abgesteckt werden.

Den (einzigen) Dialog, den ich für sinnvoll erhalte, sieht bei mir so:

agif.PNG

Also Stick anschließen, einmal Klicken, nächsten Stick anschließen usw.

Das sollte die "Arbeitsvorgänge" minimieren.

Bin gern offen für jegliche Kritik, wie man das anders/besser hätte machen können. 🙂
 

Zurück
Oben