Wie kann ich einen Dateipfad ermitteln??

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

Wie kann ich einen Dateipfad ermitteln??

Beitrag von der.milco »

Hallo zusammen!

Ich arbeite mit OO 3.0 unter WinXP und habe folgendes Problem:
Ich möchte in einem geöffnetem CALC-Dokument den aktuellen Dateipfad ermitteln, damit ich mit einem anderen Makro neue Dokumente im selben Verzeichnis erzeugen und speichern kann. Das muss ich aber ersteinmal herausfinden, wo mein aktuell geöffnete Tabelle gespeichert ist.
Der Dateiordner soll später auf verschiedenen Rechern existieren; unterschiedliche Benutzer haben allerdings unterschiedliche Verzeichnisse, sodass ich das nicht im Voraus festlegen kann.

Ich habe sämtliche Codes gefunden, die den Pfad, den Dokumentnamen, die Erweiterung usw. aus einem als Text vorliegendes Verzeichnis isolieren.
Aber nirgens einen Hinweis, wie ich das Verzeichnis ermitteln kann.
Auch hier habe ich die Foren vergeblich durchsucht.

Kann jemand helfen?
Karolus
********
Beiträge: 7519
Registriert: Mo, 02.01.2006 19:48

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von Karolus »

Hallo

Code: Alles auswählen

...
surl = thiscomponent.url
'oder
'surl = thiscomponent.location
apfad = split(surl,"/")
apfad(ubound(apfad)) = ""
spfad = join(apfad,"/")
msgbox spfad
....
gibt den Pfad zur gerade aktiven Datei aus sofern diese schon einen Speicherort hat.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.2.1 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von turtle47 »

Hallo Zusammen,

ich hätte das so gelöst:

Code: Alles auswählen

Sub Main
msgbox DirectoryNameoutofPath(convertfromurl(thisComponent.url),"\")
End Sub
Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von komma4 »

Bei Jürgens Lösung muss die Bibliothek TOOLS geladen werden (darin befindet sich die Funktion DirectoryNameoutofPath)

Ausserdem würde ich den Pfadtrenner durch die (undokumentierte) Funktion getPathSeparator() bestimmen lassen, damit der Code auch wahlweise unter anderen (nicht-Windows) Betriebssystemen läuft.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von der.milco »

Hallo nochmal,

ich habe jetzt den Code von Jürgen genommen. Der ist kurz und macht genau das, was ich haben möchte.


ALLERDINGS....
Jetzt habe ich das Problem dass meine Tabelle (wenn sie zuende programmiert ist) später eine Vorlage sein soll. Wenn ich dann auf die Vorlage klicke, erstellt sich ja ein neues noch unbenanntes Dokument, das noch nicht gespeichert wurde (und auch nicht am Anfang gespeichert werden soll! Die Tabelle soll mit Daten aus einer anderen Datei gefüllt werden und erst dann gespeichert werden, da die fremden Daten auch gleichzeitig den Dateinamen bestimmen).

Wenn ich jetzt

Code: Alles auswählen

thisComponent.url
laufen lasse, kommt eine Fehlermeldung. Ist ja auch klar, denn das Dokument hat ja noch keinen Speicherort und kann deswegen nicht seinen Pfad nennen.

Gibt es jetzt eine Möglichkeit, dass ich den Speicherort der Vorlage ermitteln kann, mit der das neue Dokument erzeugt wurde??
Evtl. kann der Speicherort der Vorlage mit dem Erzeugen eines Dokuments als Variable (oder so) übergeben werden !?!?!?

Geht so was??
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von komma4 »

Naja, wenn Du unbedingt im Pfad der Vorlage speichern möchtest ... ?

nehme

Code: Alles auswählen

ThisComponent.DocumentProperties.TemplateURL
gilt erst ab ab Version 3
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von Stephan »

Naja, wenn Du unbedingt im Pfad der Vorlage speichern möchtest ... ?
Ich nehme mal an es geht darum den Pfad für eine nicht in die Vorlagenverwaltung integrierte Dokumentvorlage zu bestimmen, ich kann dafür aber auf die Schnelle nichts vorschlagen, wobei die Info vorhanden sein müßte, denn es ist der beim Aufruf an soffice übergebene %1-Parameter in soffice -n "%1". Mittels z.B. batch ginge das, aber direkt weiß ich derzeitig nicht wie.



Gruß
Stephan
der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von der.milco »

komma4 hat geschrieben:

Code: Alles auswählen

ThisComponent.DocumentProperties.TemplateURL
gilt erst ab ab Version 3
Das funktioniert bei mir nicht und ich habe OO 3.0.1.
Ich bekomme mit diesem Code nur eine leere MsgBox, wenn ich folgendes Makro abspiele:

Code: Alles auswählen

Sub Vorlagen_URL
	msgbox ThisComponent.DocumentProperties.TemplateURL
End Sub
Muss ich da vorher noch eine Bibliothek anmelden oder irgendeine Variable definieren?

Übrigens: Egal ob ich das Dokument als ODS oder als OTS oder als ein neu erzeugtes Dok aus einer Vorlage geöffnet habe; die Msgbox bleibt immer leer und es kommt keine Fehlermeldung!
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von komma4 »

der.milco hat geschrieben:die Msgbox bleibt immer leer und es kommt keine Fehlermeldung!
Dann wird sich die Vorlage nicht in Deinem Dokument 'verewigt' haben:
kontrolliere, ob Du bei Datei>Eigenschaften...>Allgemein>Vorlage etwas stehen hast... wahrscheinlich nicht.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von turtle47 »

Hallo Zusammen,
komma4 hat geschrieben:Dann wird sich die Vorlage nicht in Deinem Dokument 'verewigt' haben:
Das funktioniert nur dann, wenn man das Dokument als Dokumentvorlage abgespeichert hat via
Menue > Dokumentvorlage > Speichern ....
Der Pfad dahin lauten dann z.B.

Code: Alles auswählen

file:///C:/Dokumente%20und%20Einstellungen/User/Anwendungsdaten/OpenOffice.org/3/user/template/MeineCalcVorlage.ots
Aber ich glaube das ist von der.milco nicht so gewollt.

Als Workaround würde ich vorschlagen den Speicherpfad in der Dokumenteninfo > Reiter Benutzer > Info 1 zu hinterlegen.

Eintragen kann man wie folgt:

Code: Alles auswählen

Sub URL_Eintragen
	GlobalScope.BasicLibraries.LoadLibrary("Tools")
	EintragURL = DirectoryNameoutofPath(convertfromurl(thisComponent.url),"\")
	thiscomponent.getDocumentInfo.setUserFieldValue(0,EintragURL)
End Sub
Auslesen wie folgt:

Code: Alles auswählen

Sub URL_Auslesen
	EintragURL= thisComponent.DocumentInfo.getUserFieldValue(0)
	msgbox EintragURL	
End Sub
Viel Erfolg.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
der.milco
***
Beiträge: 51
Registriert: Mo, 07.11.2005 16:44

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von der.milco »

komma4 hat geschrieben:Dann wird sich die Vorlage nicht in Deinem Dokument 'verewigt' haben:
kontrolliere, ob Du bei Datei>Eigenschaften...>Allgemein>Vorlage etwas stehen hast... wahrscheinlich nicht.
Das stimmt. Die Zeile ist bei mir leer.

turtle47 hat geschrieben:Das funktioniert nur dann, wenn man das Dokument als Dokumentvorlage abgespeichert hat via
Menue > Dokumentvorlage > Speichern ....
Das verstehe ich nicht ganz. Ist das eine andere Funktion/Befehl als wenn ich über Menü>Datei>Speichern unter...>Vorlage abspeichere?
Auf jeden Fall ist das Verzeichnis das von dir beschriebene (User/Anwendungsdaten/OpenOffice.org/3/user/template).
Und selbst wenn ich das mache und darunter abspeichere, bleibt die Zeile im Fenster [Menü>Datei>Eigenschaften...>Allgemein>Vorlage] leer.
turtle47 hat geschrieben:Als Workaround würde ich vorschlagen den Speicherpfad in der Dokumenteninfo > Reiter Benutzer > Info 1 zu hinterlegen.
Eintragen kann man wie folgt:

Code: Alles auswählen

Sub URL_Eintragen
       GlobalScope.BasicLibraries.LoadLibrary("Tools")
       EintragURL = DirectoryNameoutofPath(convertfromurl(thisComponent.url),"\")
       thiscomponent.getDocumentInfo.setUserFieldValue(0,EintragURL)
End Sub
Grundsätzlich ne gute Idee, aber ich kann mich nicht auf thisComponent.url beziehen, da ein neu erzeugtes Dokument ja keine URL hat.
Oder kann ich das Verzeichnis der Vorlage irgendwie an OO übergeben, bevor es daraus ein neues Dokument erzeugt, welches ich dann im neuen Dok wieder abfragen kann?
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von Stephan »

Das verstehe ich nicht ganz. Ist das eine andere Funktion/Befehl als wenn ich über Menü>Datei>Speichern unter...>Vorlage abspeichere?
Ja.

Genau deswegen habe ich ja heute Nacht kurz geantwortet um zu verdeutlichen das Du wahrsacheinlich keine integrierte Dokumentvorlage benutzen möchtest, weil mir der Einwurf von Winfried einleuchtete, sein mAkro aber nur für integrierte Vorlagen funktioniert.

Eine Dokumentvorlage wird dann in das Dokument eingetragen, wenn sie zum Zeitpunkt ihrer Benutzung in die Vorlagenverwaltung integriert ist. Das ist sie automatisch wenn Du über Datei-Dokumerntvorlage-Speichern speicherst letztlich aber auch wenn Du irgendwie (z.B. Datei-Speuichern) die Vorlagendatei in dem oder den richtigen Vorlagenordner speicherst oder reinkopierst.

Da nun Wilfrieds Vorschlag nur für integrierte Vorlagen klapptwar seine Kritik:
Naja, wenn Du unbedingt im Pfad der Vorlage speichern möchtest ... ?
so zu verstehen da er nicht versteht warum Du praktisch die erzeugten Dokumente immer im selben Pfad speichern willst, weil sie dort gespeichert werden sollen woi die Vorlagen sind, deren Speicherort aber nicht beliebig sein darf solange der Mechanismus der Integration der Vorlagen unnd deren Auslesen per Basic normal funktionieren soll.


Schön wärs gewesen wenn Du meinen ursprüngliche Hinweis gelesen und durchdacht hättest, dann hätte ich mir den Roman hier sparen können.
In Wahrheit gehts hier im Übrigen um OOo-Grundlagen und keinesfalls um exotische Expertenkenntnisse. Nein, ich behaupte nicht man muß das automatisch wissen, man muß das aber lernen wenn man vernüftig mit OOo arbeiten will und man sollte es wissen wenn man OOo programmiert.


Eine einfache Lösung zu Deinem Problem sehe ich derzeitig nicht wenn alles automatisch laufen soll. Du müßtest Dir wohlö ein andees Vorgehen überlegen oder andere 'Rahmenbedingungen' nennen damit wir bessere/andere Vorschläge machen können.


Gruß
Stephan
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von eBayer »

Hallo, ich verfolge diese Diskussion schon eine Weile.
Habe zwar kein Expertenwissen, aber trotzdem einen Vorschlag.
Könnte man nicht den gewünschten Pfad in einer Environmentvariablen oder in einer Ini-Datei hinterlegen?
Dann müsste man das auf jedem Rechner einmal so konfigurieren und fertig ist die Sache.
Ich habe so etwas ähnliches in ooBase gemacht (Environmentvariable), um zusätzliche Informationen aus einer Textdatei einzulesen.
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von Stephan »

Könnte man nicht den gewünschten Pfad in einer Environmentvariablen oder in einer Ini-Datei hinterlegen?
Dann müsste man das auf jedem Rechner einmal so konfigurieren und fertig ist die Sache.
Sicher könnte man das, aber wenn man vorausetzt das solche Änderungen zulässig sind, als das Finden des Pfades nicht ohne Veränderungen im System funtionieren muß sind doch solche Veränderungen nicht die erste Wahl, da statisch.
Ich hatte schon gesschrieben das ich dann eine einfache Batch-Datei nutzen würde um den ohnehin automatisch übergebenen Parameter %1 in soffice -n %1 abzufangen, denn der enthält den gewünschten Pfad der Vorlagendatei.



Gruß
Stephan
hawkhunter2002
**
Beiträge: 32
Registriert: So, 25.02.2007 09:11
Wohnort: Ingolstadt

Re: Wie kann ich einen Dateipfad ermitteln??

Beitrag von hawkhunter2002 »

Hallo der.milco

ich hatte dieses Problem schon vor Jahren :) noch unter OOo 2.02 so.
Unsere Lösung damals war folgende.

Code: Alles auswählen

Sub Main
 msgbox Urlpfad()
End Sub

'Funktion um den Pfad zur OrginalVorlage zu erhalten
Function getLoadedUrl(document As Object) As String
	DIM result as String
	DIM Args as Any
	DIM i as Integer
	
	result = ""
	args = document.Args
	For i = LBound(args()) To UBound(args())
		If args(i).Name = "URL" Then
			result = args(i).Value
			Exit For
		End If
	Next i
	getLoadedUrl() = result
End Function


Function Urlpfad()
	dim url as any
	
	url = ThisComponent.getDocumentInfo().TemplateFileName ' Dateiname mit Pfad der zuständigen Vorlage
	
	If url = ""  Then
		url = getLoadedUrl(ThisComponent)
		
		If url = "" Then
			MsgBox "Warnung! Kein Pfad zur Vorlage/Dokumentherkunft bekannt!"		
			url = ThisComponent.URL
			If url = "" Then
				MsgBox "Shit happens..."
				Exit Function
			End If
		End If
	End If
	UrlPfad = url
End Function
Versuchs einfach mal

Gruß Hawk

PS: Die Reihenfolge der Functions ist didaktisch nicht ganz richtig 8) und wahrscheinlich kann man das ganze auch in eine sub schreiben, aber mir sind mehrere kleine übersichtliche Funktionen lieber als eine große Sub.
OOO Basic Programmierers best Friend XRay-Tool
Antworten