MV13.3.0: Speichern unter Linux
-
Ich hab mit dem Verfassen meines Posts vorhin so lange gebraucht, dass ich Deines zuerst übersehen hatte. War ggfs. zeitlich nah beieinander. Ich hab jedenfalls nochmal git pull gemacht und in MV13.3 die Wesentlichen Zeilen (LinkOption.NOFOLLOW_LINKS und logging) eingebaut. Zeilennummer in checkPathWriteable stimmt daher nicht ganz mit Deiner Datei zusammen… aber es kommt auch hier zu der exception (wie o.g. wirft bereits das Files.createDirectories(path); die Exception, also die Zeile vor der geänderten Zeile (Files.isDirectory(path, LinkOption.NOFOLLOW_LINKS))
[ERROR] 2019-09-02 20:35:29.558 [AWT-EventQueue-0] mediathek.tool.GuiFunktionenProgramme - checkPathWritable()
java.nio.file.FileAlreadyExistsException: /home/rubikon/Videos/Neulink
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:94) ~[?:?]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111) ~[?:?]
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:116) ~[?:?]
at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:385) ~[?:?]
at java.nio.file.Files.createDirectory(Files.java:689) ~[?:?]
at java.nio.file.Files.createAndCheckIsDirectory(Files.java:796) ~[?:?]
at java.nio.file.Files.createDirectories(Files.java:742) ~[?:?]
at mediathek.tool.GuiFunktionenProgramme.checkPathWriteable(GuiFunktionenProgramme.java:370) ~[MediathekView.jar:?] -
Scheint’s ist das Phänomen seit Juli 2015 als Problem gemeldet, für Java 7. Allerdings wurde die Meldung als “Not an issue” bewertet und die Meldung als resolved markiert.
https://bugs.openjdk.java.net/browse/JDK-8130464
Also ich hab mal quick & dirty eine Version gebaut, in der ich mittels
File.getCanonicalFile()
die Exception in Files.createDirectories umgehe. Also erst den Pfad mit symlink auflösen zum canonical path - und auf diesen canonical path dann Files.createDirectories(canonicalPath) aufrufen.
D.h. das obige Szenario mit dem sym link funzt mit dieser Version unter meiner Linux VM.Danke an Stackoverflow!
https://stackoverflow.com/questions/813710/java-1-6-determine-symbolic-linksBitte nicht hauen, wenn der Vorschlag nicht gefällt. Ist nur so ein Gedanke… und mal wieder so ein Fall, wo man vom 100.ten ins 1000.te kommt vor lauter Spezialfällen
-
@rubikon und genau das ist mittlerweile das Problem mit Java. Funktionen gehen angeblich, dann stellt man fest daß sie auf einer Plattform nicht funktionieren, auf den anderen aber schon. Und beim Lösen von Bugs war Oracle teilweise sehr kreativ indem sie einfach ignoriert wurden. Und am Ende des Tages muss man spaghetti Code bauen der dann überall läuft.
Kannst du für deine Änderungen einen Pull request erstellen? Dann schau ich sie mir an und würde die integrieren wenn es überall funktioniert
-
@DerReisende77 pull request schau ich mir heute Abend an, wie das geht. Ist aber eigentlich nur 1 Zeile Code.
Was ich gestern Nacht noch gesehen habe: mit per mklink oder junction erstellten links funktioniert meine Methode unter einem …
… ich traue mich nicht, es zu sagen…
…vielseits beliebten amerikanischen Betriebssystem aufs erste Hinschaue nicht. Dort gibt’s scheint’s keinen Unterschied zwischen canonical path und absolute path, so wie unter zumindest Debian… seufz
Aber immerhin würde Files.isSymbolikLink greifen. Muß mal nachdenken. -
@rubikon man kann es auch ruhig Windoof nennen du kannst die Funktion komplett auch gerne hier rein Posten. Dann sparst du dir den LR Aufwand wenn es nicht zu viel ist.
Aber es sollte schon auf allen Plattformen funktionieren -
@DerReisende77 Ich hab, parallel in Win10 und Debian testing im Wesentlichen mit einer 13.3.0 (master) gearbeitet, mit Ausnahme mediathek.tool.GuiFunktionenProgramme
In der besagten Datei hab ich einiges aus develop genommen und selbst mal ein wenig gespielt.
Ggfs. sind Ideen dabei, mit denen Du Dich anfreunden kannst.GuiFunktionenProgramme.checkPathWriteable.txt
Also die Probleme, die ich hatte waren:
- Weder Linux noch Windows mögen als Parameter für Files.createDirectories einen symlink, sh. oben.
- Linux will für Files.createDirectories einen canonical path bei symlinks
- Windows gibt für mklink/junction dasselbe Ergebnis für absoluteFile und canonicalFile
- die Option LinkOption.NOFOLLOW_LINKS aus Files.isDirectory liefert false für Links, die auf ein Verzeichnis zeigen.
Ich hab mir dann gedacht:
Files.createDirectories besser nicht aufrufen, wenn isSymbolicLink true liefert.
Files.createDirectories insgesamt nur dann aufrufen, wenn path weder auf ein Verzeichnis noch auf einen Link zeigt.Bei mir scheint’s zu laufen, aber ich hab aktuell die Option weg, einen Unterordner mit Thema anzulegen.
-
@rubikon Ich habe gerade eine andere Version im develop branch eingecheckt die bei meinen Tests funktioniert. Kannst Du das mal bitte ausprobieren?
-
@DerReisende77 ja, mach ich.
Das, was im Moment eingecheckt ist, ist beweisbar eine Kontradiktion und kann nicht funktionieren:bool ret = false; // Initialisierung
ret wird aber auf keiner Stelle auf true gesetzt…
// die nicht auskommentiert ist.
Krieg ich aber hin, hoffe ich - und dann meld ich mich. Danke schon mal!:thumbs_up:
-
@rubikon das true kommt durch den temFile.delete wenn erfolgreich.
-
@DerReisende77 oi,:face_screaming_in_fear: Sorry!:zipper-mouth_face:
Wo hatt ich denn da meine Augen beim Feixen! :confounded_face:
Na der :pistol: ging ja wohl nach hinten los schäm
Ich gehör ins Bett, bin bratfertig :face_with_head-bandage: :pile_of_poo:Jedenfalls:
In einer modifizierten 13.3.0 mit diesem Code für checkPathWriteable/checkPathWriteable2 aus der aktuellen develop nimmt der Dialog zum “Film Speichern unter” Verzeichnisse mit und ohne symlinks erfolgreich an. Unter Windows und Linux.
Wenn ich dagegen als “Verzeichnis” einen Symlink auf eine Datei eintippe, dann heißt es, völlig zurecht, “Pfad ist nicht beschreibbar”.läuft.:thumbs_up:
-
@rubikon gut dann mache ich das hübsch Räume auf und checke die Finalversion ein.
-
@DerReisende77 sagte in MV13.3.0: Speichern unter Linux:
Ich habe gerade eine Änderung in den develop branch eingebracht. Dieser sollte das Problem beheben.
Sorry für die späte Rückmeldung. Ich habe die Problematik mit symbolischen Links noch mal im aktuellen Develop Branch getestet. Scheint jetzt fehlerfrei unter Linux zu laufen. Danke.