# Datei kann nicht umbenannt oder verschoben werden ??



## MiMa (8. Okt 2017)

Ich möchte gerne eine Datei verschieben.
Dafür habe ich eine eigene Methode geschrieben, die im Kern folgenden Code ausführt

```
// 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?

```
dateiObjekt.getDateiQuelle().setLastModified(millisekunden);
```
Vielen Dank
M


----------



## Robat (8. Okt 2017)

Arbeitest du unter Windows?
Dann schau mal hier.


----------



## MiMa (9. Okt 2017)

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.


----------



## Flown (9. Okt 2017)

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.


----------



## MiMa (9. Okt 2017)

Ich weis jetzt nicht, ob das so einfach ist?

```
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);


----------



## InfectedBytes (9. Okt 2017)

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?


----------



## MiMa (9. Okt 2017)

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.


----------



## InfectedBytes (9. Okt 2017)

MiMa hat gesagt.:


> Es wurde auch kein einen Stream auf diese Datei geöffnet. ...
> Die Extraktion erfolgte über die Apache Tika Klassen.


Da Tika Informationen aus der Datei extrahiert, muss es diese natürlich auch öffnen. Und genau hier wird dein Problem liegen, Tika schließt die Datei nicht wieder, bzw. du musst sie ggf selbst schließen.


----------



## MiMa (9. Okt 2017)

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? 

```
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
```


----------



## InfectedBytes (9. Okt 2017)

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.


----------



## MiMa (9. Okt 2017)

Die Text Extrahierung habe ich in eine eigene Methode gelegt.
Absolut unspektakulär.

```
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
```


----------



## InfectedBytes (9. Okt 2017)

Übergib der parseToString methode einfach einen selbst geöffnet input stream und schließe diesen im Anschluss auch wieder.


----------



## MiMa (9. Okt 2017)

Kannst Du mir mal zeigen wie?
Bin mir nicht sicher ob ein java.io oder Tika Stream sein muss?
Danke


----------



## InfectedBytes (9. Okt 2017)

sollte grob so aussehen:

```
Inputstream input = null;
try {
  input = new FileInputStream(dateiQuelle);
  String inhalt = tikaObjekt.parseToString(input);
} catch(IOException ex) {
  // .. Fehlerbehandlung
} finally {
  if(input != null) input.close();
}
```


----------



## MiMa (9. Okt 2017)

Danke,
muss ich das dann für auch für jede andere Extraktion von Metadaten auch machen?
Wie Dateityp, Dateiendung usw.


----------



## InfectedBytes (9. Okt 2017)

nur wenn dazu die Datei geöffnet werden muss, also tatsächlich der Inhalt benötigt wird, was eben bei Datei Name/Endung nicht nötig ist.


----------



## MiMa (9. Okt 2017)

Also das mit dem verschieben klappt nicht.
Irgendwo wird wird immer noch darauf zugegriffen. 
Das kopieren der Datei mit

```
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.


----------



## MiMa (9. Okt 2017)

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.


----------

