Datei kann nicht umbenannt oder verschoben werden ??

MiMa

Top Contributor
Ich möchte gerne eine Datei verschieben.
Dafür habe ich eine eigene Methode geschrieben, die im Kern folgenden Code ausführt
Java:
// Umbenennen / Verschieben der Datei
        if (alterName.renameTo(neuerName)) {
            IndexLogger.info("Datei wurde erfolgreich umbenannt/verschoben");
        } else {
            IndexLogger.info("Datei konnte nicht umbenannt/verschoben werden");
        } // if-else
Leider möchte die PDF Datei nicht verschoben werden und erhalte im Log die Ausgabe:
Datei konnte nicht umbenannt/verschoben werden aus dem else-Abschnitt.
Mit den Debugger habe ich alles nach geschaut und konnte keine ungereimtheiten feststellen. Seltsamerweise funktioniert das mit anderen Datei wunderbar???
Die PDF war dabei geöffnet und ich dachte, das es daher nicht geklappt hat.
Leider war dies nicht das Problem.
Irgendetwas muss mit der Datei sein?
Weiss vielleicht jemand warum manche Dateien so zicken machen?
Die besagte Datei ist ein PDF Scan mit einem OCR Textinhalt.
Die Datei kann ich aber mit dem Datei-Explorer kopieren verschieben und auch löschen.
Aber keine umbenennung mit Java?
Ich habe auch in dieser Datei das Änderungsdatum berschrieben und das hat aber funktioniert?
Java:
dateiObjekt.getDateiQuelle().setLastModified(millisekunden);
Vielen Dank
M
 
Bedeutet das, man soll File überhaupt nicht mehr nutzen und besser die nio2 Klasse verwenden?
Dann müsste ich alle Methoden in denen ich File verwendet habe umschreiben und stattdessen Path verwenden!?!
Es gibt ja immer noch viele Klassen, die File benötigen!
Ich programmiere derzeit unter Windows 10, arbeite aber auch mit macOS.
 
Zuletzt bearbeitet:
Nein heißt es nicht. Die NIO.2 API ist einfach non-blocking-io, aber bietet mehr Kontrolle (und bessere Exceptionhandling Möglichkeiten).
Man kann leicht zwischen File und Path hin und her switchen mit toFile und toPath.

Ich verwende gerne die Files Klasse zum Überprüfen von Files und erstellen von In-/OutputStreams.
 
Ich weis jetzt nicht, ob das so einfach ist?
Code:
Path alteDatei = alterName.toPath();
Path neueDatei = neuerName.toPath();
Files.move(alteDatei, neueDatei);
Habe die Methode so abgeändert, die IDE gemängelt keine Fehler.
Beim ausführen gibt es jedoch ein Problem und die Datei wird nicht verschoben.
Die Problemzeile ist : Files.move(alteDatei, neueDatei);
 
Ohne zu wissen welche Exception geworfen wird, kann man nur rumraten.
Kann es vielleicht sein das du die zu verschiebende Datei in deinem Programm geöffnet aber nicht geschlossen hast?
 
Ich erhalte in der Problemmitteilung:
Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.
Ich habe den Rechner neu gestartet, mit dem Datei-Explorer nicht darauf zugegriffen.
Ein Zugrif erfolgte lediglich im Java Programm selbst, indem ich die Datei gelistet und Informationen extrahiert habe. Es wurde auch kein einen Stream auf diese Datei geöffnet. Ebenfalls habe ich das schreiben des Änderungsdatums deaktiviert.
Die Extraktion erfolgte über die Apache Tika Klassen.
 
Ich hatte angenommen, wenn Tika etwas öffnet, das es dann auch wieder schliesst?!
Zumindest hatte das verschieben mal in meinem Java Programm mit der "renameTo" Methode funktioniert.
Über ein schliessen habe ich in den Tutorials und in dem Buch Tika in Action nie gelesen.
http://www.w3ii.com/de/tika/tika_content_extraction.html
Demnach wüsste ich jetzt nicht wo und wie ich etwas schliessen sollte?
Habe jetzt mal eine Datei.txt ohne Extraktion verschieben wollen.
Es gabe jetzt keine Fehler, allerdings wueder die Datei auch nicht verschoben? 🙁
Java:
public static void umbenennenDatei(File alterName, File neuerName) throws IOException {

        // Entfernen der Leerzeichen aus dem neuen "Dateinamen"
        neuerName = new File(neuerName.getParentFile() + "/" + Text.entferneLeerzeichen(neuerName.getName()));

        IndexLogger.info("Alter Dateiname        : " + alterName);
        IndexLogger.info("Neuer Dateiname        : " + neuerName);

        // Prüfen ob das Zielverzeichnis schon existiert
        if (!neuerName.getParentFile().exists()) {
            IndexLogger.info("Das Verzeichnis existiert nicht");
            neuerName.getParentFile().mkdir();
            IndexLogger.info("Das Verzeichnis wurde erstellt");
        } // if-Bedingung

        // Prüfen ob der neueName im Zielverzeichnis schon existiert
        if (neuerName.exists()) {
            neuerName = pruefenDateiExistiert(neuerName);
            IndexLogger.info("Die Datei existiert bereits und wurde daher umbenannt : " + neuerName);
        } // if-Bedingung

        // Umbenennen / Verschieben der Datei
//        if (alterName.renameTo(neuerName)) {
//            IndexLogger.info("Datei wurde erfolgreich umbenannt/verschoben");
//        } else {
//            IndexLogger.info("Datei konnte nicht umbenannt/verschoben werden");
//        } // if-else
        Path alteDatei = alterName.toPath();
        Path neueDatei = neuerName.toPath();
        Files.move(alteDatei, neueDatei);
    } // umbenennenDatei
 
Wie genau sieht denn dein extraction code aus?
ggf. musst du halt einen eigenen stream and Tika übergeben, denn kannst du dann auch selbst wieder schließen.
 
Die Text Extrahierung habe ich in eine eigene Methode gelegt.
Absolut unspektakulär.
Java:
public static String extrahiereText(File dateiQuelle) throws IOException, TikaException {
        // Erzeugt ein Tika-Objekt
        Tika tikaObjekt = new Tika();

        // Extrahiert den Inhalt der Datei
        String inhalt = tikaObjekt.parseToString(dateiQuelle);
        IndexLogger.info("Der Dateiinhalt wurde in die Instanzvariable \"inhalt\" extrahiert");
        return inhalt;
    } // extrahiereInhalt
 
sollte grob so aussehen:
Java:
Inputstream input = null;
try {
  input = new FileInputStream(dateiQuelle);
  String inhalt = tikaObjekt.parseToString(input);
} catch(IOException ex) {
  // .. Fehlerbehandlung
} finally {
  if(input != null) input.close();
}
 
Danke,
muss ich das dann für auch für jede andere Extraktion von Metadaten auch machen?
Wie Dateityp, Dateiendung usw.
 
Also das mit dem verschieben klappt nicht.
Irgendwo wird wird immer noch darauf zugegriffen. 🙁
Das kopieren der Datei mit
Code:
 Files.copy(alteDatei, neueDatei);
Funktioniert jedoch einwandfrei.

*** Nach ein paar Stunden ***
Habe jetzt alle Parser ind Tika Aktivitäten abgeschaltet und jetzt kann ich die Datei umbenennen oder Verschieben.
Und zwar funktioniert es jetzt mit der "renameTo" als auch mit der "move" Methode.

Die Methode des Umbenennens arbeitet korrekt.
Es ist wirklich schade, das Tika die Parser selbst nicht mehr schließt.

Zumindes habe ich jetzt einen Ansatz für eine Lösung.
 
Zuletzt bearbeitet:
Soweit ist jetzt alles aktualisiert worden und nun funktioniert es wie es soll.
Die Übeltäter wurden identifiziert und entsprechende stellen in Methoden geändert.
Vielen Dank noch für Eure Hilfe.
🙂
 

Neue Themen


Zurück
Oben