Älteste Datei im Verzeichnis per Makro öffnen

Hallo zusammen!

Mit einem Makro möchte ich die älteste Textdatei in einem Verzeichnis (das bestimmt nicht leer ist) öffnen. Der Befehl Dir(Pfad, 0) scheint zu würfeln, welche Datei er gerade öffnen möchte.

Wie kann ich per Makro die älteste - genauso gut wäre: die in einer nach Dateinamen sortierte Liste erste - Datei öffnen?

Frank

Hallo

from pathlib import Path

desktop = XSCRIPTCONTEXT.getDesktop()

file_path = min( Path.home().glob("Documents/dein_nicht_leeres_Verzeichnis/*.txt"),
                key=lambda path: path.stat().st_ctime )
               # oder key=lambda path: path.name )
desktop.loadComponentFromURL( file_path.as_uri(), "_default", 0, (),)

in einer Funktion dann so:

from pathlib import Path

def load_oldest_txt():
    desktop = XSCRIPTCONTEXT.getDesktop()
    file_path = min( Path.home().glob("Documents/dein_verzeichns/*.txt"),
                key=lambda p: p.name )   # oder p.stat().st_ctime)

    desktop.loadComponentFromURL( file_path.as_uri(), "_default", 0, (),)

Danke!
Es scheint eine Lösung zu geben.
Das scheint aber Python zu sein, und ich schreibe ein Basic-Makro, weil ich mit Python nicht zurechtkomme.
Gibt es auch eine Basic-Lösung?

Er kann nicht programmieren - aber er tut’s! :wink:
Ich habe mal ein mit LO mitgeliefertes Python-Skript ganz naiv angepasst und karolus’ Vorschlag dort eingepflanzt. (Dabei habe ich gelernt, dass man keinen absoluten Pfad setzen darf, sondern “Documents/…” relativ sein muss.)

Allerdings öffnet das Skript dann die gefundene Datei in einem neuen Fenster. Ich hätte aber gerne, dass der Inhalt der gefundenen Datei in die aktuell geöffnete Datei eingefügt wird.

Wie geht das?

Du hattest in der Ausgangsfrage nicht geschrieben was mit der gefundenen Datei geschehen soll :wink:
Angenommen du hast gerade eine …odt geöffnet und möchtest den Inhalt der Datei an der Stelle des Cursors einfügen:

from pathlib import Path

def insert_oldest_txt():
    doc = XSCRIPTCONTEXT.getDocument()
    with(min( Path.home().glob("Documents/dein_verzeichnis/*.txt"),
                 key=lambda p: p.stat().st_ctime )).open( encoding="utf8") as textfile:
        doc.CurrentController.ViewCursor.setString( textfile.read() )

Stimmt: Ich hatte nicht geschrieben, was mit der Datei geschehen soll. Entschuldigung!
Und herzlichen Dank! Jetzt kann ich eine Datei an der aktuellen Cursorposition einfügen. Mit Deinem Makro ist der eingefügte Text allerdings noch markiert. Ins Blaue geraten habe ich mal ein doc.CurrentController.ViewCursor.collapseToEnd() angefügt, und dann steht der Cursor am Ende des eingefügten Textes. Super!
Jetzt habe ich nur noch ein kleines Problem: Wenn ich in LO über das Menü über Einfügen – Text aus Datei… gehe, wird jede Zeile mit einer Absatzmarke abgeschlossen; so soll es sein.
Wenn ich das Makro ausführe, steht am Ende jeder Zeile eine Zeilenschaltung (also keine Absatzmarke). Wie kann man auch mit Makro eine Absatzmarke hinbekommen? (Wie macht es LO beim Einfügen über das Menü??)

Ich habs befürchtet… ersetze in der letzten Zeile:

textfile.read() 
# durch 
textfile.read().replace("\n", "\r" )

Die gibts wohl … aber da musst du locker 10 - 25 Zeilen mehr einplanen, und dich intensiv mit Api-methoden auseinandersetzen. Ich weigere mich inzwischen einfache python-lösungen in umfangreiche komplizierte Basic-lösungen zu übersetzen

… und schon klappt’s! Klasse!!
Und ich habe eine Menge gelernt.
Vielen herzlichen Dank!!!

Jetzt brauche ich auch keine Basic-Lösung mehr. Bisher kam ich mit Basic prima zurecht. Vor Python bin ich immer zurückgeschreckt, weil da nicht durchgestiegen bin. Aber was man mit Python hinkriegt, muss man nicht mit Basic probieren. Also noch mal ein dickes Dankeschön!

Hallo
Es geht auch mit der Methode …insertDocumentFromURL eines TextCursors:

from pathlib import Path

def insert_oldest_txt():
    doc = XSCRIPTCONTEXT.getDocument()
    vc = doc.CurrentController.ViewCursor
    tc = doc.Text.createTextCursorByRange( vc )
    fpath = min( Path.home().glob("Documents/dein_Verzeichnis/*.txt"),
                 key=lambda p: p.stat().st_ctime )
    tc.insertDocumentFromURL( fpath.as_uri(), (),)

Auch diese Methode werde ich mir merken - danke!
Schön ist auch, dass hiermit keine Absatzmarke am Ende eingefügt ist (was bei der ersten Lösung kein Nachteil ist, aber jetzt hat man die Wahl).

mit »merken« kommst du nicht weit…besser is dann schon
apso.oxt zum verwalten und debuggen
mri.oxt zum inspizieren der Api-objecte

und um die Konzepte in python zu verstehen
die offiezielle Doku

Bei drei Python-Skripten traue ich mir das Merken trotz drohender Altersdemenz :wink: noch zu. Aber der Link zur offiziellen Python-Dokumentation kommt in meine Linksammlung. Danke!

Noch eine Ergänzung für alle, die bis hierhin lesen: neben ctime (change; Metainformationen ändern) gibt es auch mtime (modify; Inhalt ändern) und atime (access; Dateizugriff), vgl. https://wiki.ubuntuusers.de/find/

:+1: :+1: :+1:
https://docs.python.org/3/library/pathlib.html#pathlib.Path.stat