Datei verschieben hat einen Fehler??

Diskutiere Datei verschieben hat einen Fehler?? im Allgemeine Java-Themen Bereich.
M

MiMa

Hallo,
aktuell habe ich scheinbar ein Problem bei meiner Funktion zum umbenennen oder verschieben einer Datei?
Java:
public static void umbenennenVerschieben(File alterName, File neuerName) {
        LOG.info("Alter Dateiname : " + alterName);
        LOG.info("Neuer Dateiname : " + neuerName);

        // neuerName = pruefeExistenzDatei(neuerName);

        if (alterName.renameTo(neuerName)) {
            LOG.info("Datei wurde erfolgreich umbenannt/verschoben");
        } else {
            LOG.info("Datei konnte nicht umbenannt/verschoben werden");
        }
    } // umbenennenVerschieben
Die Log Ausgabe
Code:
020-05-11 14:31:18 [main] INFO  Dateiarten.Datei - Alter Dateiname : B:\01 Postfach\NeueBitmap.bmp
2020-05-11 14:31:18 [main] INFO  Dateiarten.Datei - Neuer Dateiname : B:\Loeschen\NeueBitmap.bmp
2020-05-11 14:31:18 [main] INFO  Dateiarten.Datei - Datei konnte nicht umbenannt/verschoben werden
Beide Werte sind vom Typ File.
Bisher hatte das immer funktioniert, warum das jetzt auf einmal nicht mehr klappt ist für mich unverständlich.
Vom Code her sollte es kein Problem geben.

Sieht da jemand was, was ich nicht seh?
Danke
 
MoxxiManagarm

MoxxiManagarm

Du kannst die Ausgabe ja nur erhalten, wenn renameTo false liefert. Das dürfte dann der Fall sein, wenn die neueDatei bereits existiert.
 
mrBrown

mrBrown

Arbeite besser nicht mit File, sondern nutz die neuere Files-Api, damit bekommst du vernünftige Fehlermeldungen.
 
M

MiMa

Ich wollte die Datei in ein anderes Verzeichnis verschieben und dort ist diese nicht vorhanden.
Am JDK10 scheint es aber nicht zu liegen, damals hatte ich sie unter JDK8 geschrieben?
Im Netz habe ich des öfteren gelesen, da diese renameto Methode unter Windows scheinbar nicht immer funktioniert?
Wenn ich jetzt Files verwende muss ich dann auch alle meine Variablen vom Typ File ebenfalls ändern welche eine Datei mit Pfad, Name und Dateiendung enthält?
 
M

MiMa

Wenn ich das richtig verstanden habe dann benutzt Files jetzt Path angaben und wenn dies ein File sind dann kann man das umwandeln?
Da ich aber gerade anfange mein Programm neu zu schreiben, wäre es ratsam direkt um zu stellen?
 
M

MiMa

Ich habe das verschieben jetzt mal mit Files gemacht und auch hier gibt es einen Fehler?
Tatsächlich sind es jetzt mehr Informationen zum Fehler, die mir aber leider nichts sagen?!?!?
Java:
LOG.info("Quelldatei : " + quellDatei);
LOG.info("ZielDatei : " + zielDatei);
              
Files.move(quellDatei.toPath(), zielDatei.toPath());
// Datei.umbenennenDatei(quellDatei, zielDatei);
Logausgabe
Code:
2020-05-11 18:56:03 [main] INFO  Programm.Programmstart - Quelldatei : B:\01 Postfach\NeueBitmap.bmp
2020-05-11 18:56:03 [main] INFO  Programm.Programmstart - ZielDatei : B:\Loeschen\NeueBitmap.bmp
Fehlermeldung
Code:
t java.base/sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:92)
    at java.base/sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:103)
    at java.base/sun.nio.fs.WindowsFileCopy.move(WindowsFileCopy.java:384)
    at java.base/sun.nio.fs.WindowsFileSystemProvider.move(WindowsFileSystemProvider.java:288)
    at java.base/java.nio.file.Files.move(Files.java:1413)
    at Programm.Programmstart.main(Programmstart.java:105)
C:\Users\Michael\AppData\Local\NetBeans\Cache\11.3\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\Michael\AppData\Local\NetBeans\Cache\11.3\executor-snippets\run.xml:94: Java returned: 1
BUILD FAILED (total time: 1 second)
 
Zuletzt bearbeitet:
M

MiMa

Du meinst es ein Windows Problem ist?
Die Meldung ist offensichtlich das WindowsFileCopy Probleme macht.
Aber auch unter Windows sollte es doch funktionieren?!?
 
mrBrown

mrBrown

Nein, den Grund für die Exception. Du hast nur den untersten Teil des Stacktraces gepostet, der ist aber dafür grad am uninteressantesten
 
M

MiMa

Ja da war noch eine lange Zeile drüber die ich übersehen habe.
Ich wollte nicht noch die Warnings über J2KImageRerader und so mit Posten

Code:
Exception in thread "main" java.nio.file.FileSystemException: B:\01 Postfach\NeueBitmap.bmp -> B:\Loeschen\NeueBitmap.bmp: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
Endlich mal eine Meldung die sogar ich verstehe ;)
Aber die Datei ist weder geöffnet, noch wird sie von einem Programm zugegriffen?
 
L

LimDul

Ja da war noch eine lange Zeile drüber die ich übersehen habe.
Ich wollte nicht noch die Warnings über J2KImageRerader und so mit Posten

Code:
Exception in thread "main" java.nio.file.FileSystemException: B:\01 Postfach\NeueBitmap.bmp -> B:\Loeschen\NeueBitmap.bmp: Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
Endlich mal eine Meldung die sogar ich verstehe ;)
Aber die Datei ist weder geöffnet, noch wird sie von einem Programm zugegriffen?
Doch wird sie. Entweder hast du sie irgendwo im Programm mal geöffnet und nicht geschlossen oder irgendein anderes Programm (das die Datei da abgelegt hat) hält noch eine Referenz darauf. Outlook ist da z.B. gut drin Referenzen zu halten obwohl die Datei sichtbar nicht offen ist.
 
M

MiMa

Habe den Rechner neu gestartet und nur Netbeans geöffnet und das Programm ausgeführt.
Die Datei wird immer noch von etwas blockiert????
Im Ressourcenmonitor wollte ich nachsehen, kann aber Handle nicht finden?
Hab es jetzt auch mit anderen Dateien versucht, das gleiche Problem??
 
J

JustNobody

Was machst du denn in Deinem Programm? Wird die Datei erstellt oder was anchor du noch? Zeige doch einmal den ganzen Code!
 
M

MiMa

Im Verzeichnis "B:/01Postfach" werden alle Dateien Rekursiv in eine ArrayListe<Files> geschrieben um alle Dateien nacheinander ab zu arbeiten.
Aktuell befindet sich nur diese eine Datei im Postfach.
Ja jetzt wird es mir klar, hier ist der Zugriff. Auch schon beim erzeugen der Dateiliste wurde bereits auf die Datei zugegriffen.
Wenn ich ein Datei-Objekt erzeuge wird im Konstruktor auf die Datei zugegriffen und einiges an Daten ermittelt.
Je nach Auswertung der Daten sollen die Dateien direkt verarbeitet werden.
In diesem Falle ist die Datei 0 KB groß und soll direkt in das Verzeichnis zum löschen verschoben werden.

Mir ist nicht klar warum dieses Problem jetzt auftaucht, damals hatte ich dieses Problem nicht, allerdings entwickelte ich auch
mit Netbeans 9 und JDK 8 und heute mit Netbeans 11.3 und JDK10. Das sollte aber nicht das Problem sein?

Muss ich vor der Verarbeitung wie das verschieben die Datei irgendwie wieder freigeben?

Hier ist das Logging
Code:
2020-05-11 19:58:03 [main] INFO  Programm.Programmstart - Erstellt eine Dateiliste für gefundene Dateien aus dem Postfach
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Die Funktion "erstelleListe" wurde aufgerufen
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Eine "ergebnisListe" für neu gefundene Einträge wird erstellt
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Die Datei "B:\01 Postfach\NeueBitmap.bmp" wurde der "dateiListe" hinzugefuegt
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Die gefundene "dateiListe" wird zurueckgegeben
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - *****************************************************************************
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Die Dateiliste wird ausgegeben
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - B:\01 Postfach\NeueBitmap.bmp
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Es wurden 1 Eintraege gefunden
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - *****************************************************************************
2020-05-11 19:58:03 [main] INFO  Programm.Programmstart - Erstellt ein Dateiobjekt für das speichern von Daten zur Datei
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Die Quelldatei ist                 : B:\01 Postfach\NeueBitmap.bmp
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Die Zieldatei ist                  : B:\02 Bibliothek\NeueBitmap.bmp
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Der Dateiname mit Endung ist       : NeueBitmap.bmp
2020-05-11 19:58:03 [main] INFO  Dateiarten.Datei - Der Dateiname ohne Endung ist      : NeueBitmap
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Der Medien-Typ wurde ermittel      : image/bmp
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Der Medien-HauptTyp ist            : image
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Der Datei-Untertyp ist             : bmp
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Die Dateieindung aus der Datei ist : .bmp
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Das Erstellungsdatum ist           : 2019-12-19T13:10:47.621946
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Das Änderungsdatum ist             : 2017-09-25T11:47:16.466
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Die Dateigröße ist                 : 0(KB)
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Die Prüfsumme der Datei ist        : d41d8cd98f00b204e9800998ecf8427e
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Ist die Datei Lesbar ?             : true
2020-05-11 19:58:04 [main] INFO  Dateiarten.Datei - Ist die Datei beschreibbar ?       : true
2020-05-11 19:58:04 [main] INFO  Programm.Programmstart - Die Dateigröße ist 0.0 (Bytes) und enthält daher keine brauchbaren Informationen.
2020-05-11 19:58:04 [main] INFO  Programm.Programmstart - Quelldatei : B:\01 Postfach\NeueBitmap.bmp
2020-05-11 19:58:04 [main] INFO  Programm.Programmstart - ZielDatei : B:\Loeschen\NeueBitmap.bmp
 
Zuletzt bearbeitet:
J

JustNobody

Zeig den Code, mit dem du auf die Datei zugreifst und was du genau machst.

Ohne Detail wird Dir niemand etwas genaues sagen können. In der Regel kannst Du schauen: wenn eine Klasse AutoClosable implementiert, dann sollte da auch close() aufgerufen werden bzw. das try with resources genutzt werden.
 
M

MiMa

Einmal wird darauf zugegriffen, wenn alle Dateien Rekursiv in eine ArrayList geschrieben werden.
Reskursives einlesen von Dateien.
Java:
  public static ArrayList<File> erstelleListe(File verzeichnis, ArrayList<File> dateiListe) {
        LOG.info("Die Funktion \"erstelleListe\" wurde aufgerufen");
        if (verzeichnis == null || dateiListe == null) {
            LOG.info("Das uebergebene \"verzeichnis\", \"dateiListe\" ist nicht vorhanden");
            return null;
        } // if
        LOG.info("Eine \"ergebnisListe\" für neu gefundene Einträge wird erstellt");
        File[] ergebnisListe = verzeichnis.listFiles();
        for (File eintrag : ergebnisListe) {
            if (eintrag.isDirectory()) {
                LOG.info("Der Eintrag ist ein Verzeichnis, die Funktion ruft sich selbst auf");
                erstelleListe(eintrag, dateiListe);
            } // if
            else if (eintrag.isFile()) {
                dateiListe.add(eintrag);
                LOG.info("Die Datei " + "\"" + eintrag + "\"" + " wurde der \"dateiListe\" hinzugefuegt");
            } // else-if
        } // for-Schleife
        LOG.info("Die gefundene \"dateiListe\" wird zurueckgegeben");
        LOG.info("*****************************************************************************");
        return dateiListe;
    } // erstelleListeRekursiv
Beim erzeugen des Datei-Objektes wird ein weiteres mal auf die Datei zugegriffen um die Werte zu ermitteln
Datei dateiObjekt = new Datei(quellDatei, einstellungen);
Der Konstruktor
Java:
 public Datei(File quellDatei, Einstellungen einstellungen) throws IOException, TikaException {
        this.dateiQuelle = quellDatei;
        LOG.info("Die Quelldatei ist                 : " + this.dateiQuelle);
        this.dateiZiel = erstelleZielDatei(quellDatei, einstellungen.getVerzeichnisZiel());
        LOG.info("Die Zieldatei ist                  : " + this.dateiZiel);
        this.nameEndung = quellDatei.getName();
        LOG.info("Der Dateiname mit Endung ist       : " + this.nameEndung);
        this.name = entferneEndung(quellDatei.getName());
        LOG.info("Der Dateiname ohne Endung ist      : " + this.name);
        this.MediaTyp = sucheMediaTyp(quellDatei);
        this.MediaHauptTyp = sucheMediaHauptTyp(this.MediaTyp);
        this.MediaUnterTyp = sucheMediaUnterTyp(this.MediaTyp);
        this.endung = sucheEndung(quellDatei.getName());
        LOG.info("Die Dateieindung aus der Datei ist : " + this.endung);
        this.datumErstellung = Datum.sucheDatumErstellung(quellDatei);
        LOG.info("Das Erstellungsdatum ist           : " + this.datumErstellung);
        this.datumAenderung = LocalDateTime.ofInstant(Instant.ofEpochMilli(dateiQuelle.lastModified()), TimeZone.getDefault().toZoneId());
        LOG.info("Das Änderungsdatum ist             : " + this.datumAenderung);
        this.groesseBytes = quellDatei.length();
        DecimalFormat meinFormat = new DecimalFormat("###,###,###.##");
        LOG.info("Die Dateigröße ist                 : " + meinFormat.format(this.groesseBytes/ 1024d) + "(KB)");
        this.pruefsumme = erstellePruefsumme(quellDatei);
        LOG.info("Die Prüfsumme der Datei ist        : " + this.pruefsumme);
        this.lesbar = quellDatei.canRead();
        LOG.info("Ist die Datei Lesbar ?             : " + this.lesbar);
        this.beschreibbar = quellDatei.canWrite();
        LOG.info("Ist die Datei beschreibbar ?       : " + this.beschreibbar);
    } // Konstruktor mit Parameter
 
J

JustNobody

Und was sind die ganzen Methoden, die du geschrieben hast? Das wird etwas mühselig, Dir alles aus der Nase zu ziehen ....

Wenn ich raten müsste, dann ist die Chance hoch, dass es erstellePruefsumme sein könnte ...
 
M

MiMa

Deine Glaskugel ist echt super.
Habe mal die Erstellung der Prüfsumme heraus genommen und es hat geklappt, die Datei wurde verschoben.
Methode zur Erstellung der Prüfsumme
Java:
 public static String erstellePruefsumme(File datei) throws FileNotFoundException, IOException {
        String pruefsumme = DigestUtils.md5Hex(new FileInputStream(datei));
        return pruefsumme;
    } // erstellePruefsumme
Allerdings weis ich nicht ob man hier die Datei irgendwie zur Verarbeitung wieder freigeben kann?
Wenn ich Dateien anhand von Prüfsummen vergleiche dann sollte es auch möglich sein das Duplikat zu löschen.
 
J

JustNobody

Der FileInputStream wird erzeugt und nicht geschlossen. Den also in einer Variable speichern und am Besten ein try with resources verwenden.
 
Thema: 

Datei verschieben hat einen Fehler??

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben