Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Windows Dienst + relative Pfadangaben (https://www.delphipraxis.net/97370-windows-dienst-relative-pfadangaben.html)

hirnstroem 9. Aug 2007 12:39


Windows Dienst + relative Pfadangaben
 
'loha Folks,

ich arbeite an einem Projekt, welches in drei verschiedenen Varianten erhältlich sein soll. Als Standalone Executable, als Windows Service und als ISAPI Extension.

Nun entwickle und teste ich das ganze seit einem Weilchen als Standalone Variante (die Unterschiede im Quellcode sind ausschliesslich in den jeweiligen DPR-Dateien zu finden).

Die Applikation empfängt nun ständig Bilddaten von Geräten welche an einem CAN-Bus hängen, diese möchte ich über relative Pfade abspeichern. Dabei wird zum einen der Verweis zu der Datei in einer Datenbank abgelegt und das Bild dann auch unter diesem Pfad abgespeichert. Beim betrachten des jeweiligen Datensatzes wird das Bild wieder geladen.

Nun ist es so, dass dies bei der Standalone Variante problemlos funktioniert. Der Dienst hingegen speichert die Dateien im Windows System Verzeichnis ab, was etwas unschön ist.

Ein Pfad sieht so aus:

.\Log/2007/08/09/13_16_06_Addr_30_KEY.bmp

Ist es nun möglich dem Dienst beizubringen, dass er die Daten wie gewünscht im Stammverzeichnis - also dort wo der Dienst sich befindet - abzuspeichern? Oder muss ich einen Workaround mit "ExtractFilePath" oder etwas in dieser Art einrichten? Oder kann man eventuell sogar dem Dienst angeben wo er zu Suchen hat, Falls relative Pfadangaben eingesetzt werden (ähnlich wie bei Verknüpfungen die "Ausführen in" Eigenschaft)?

Grüsse
hirnstroem

SirThornberry 9. Aug 2007 12:46

Re: Windows Dienst + relative Pfadangaben
 
es spricht nichts gegen relative Pfade. Du musst dir eben nur klar werden worauf du den realtiven Pfad beziehst. Derzeit beziehst du ihn wahrscheinlich auf das Arbeitsverzeichnis welches bei der Standalone Variante in deinem Testfall das Anwendungsverzeichnis ist. Sinnvoller wäre es aber den Pfad gleich auf das Anwendungsverzeichnis zu beziehen.
Dich hindert auch niemand daran aus dem relativen Pfad zur Laufzeit selbst einen absoluten zu machen (macht Windows sonst selbst anhand des Arbeitsverzeichnisses).
Oder das aller beste - speichere es in einen Pfad wo auch Schreibrechte vorhanden sind. Der normale Nutzer hat seit NT (mit NTFS) keine schreibrechte auf den Programme-Ordner und somit sollte da vom Programm auch nichts geschrieben werden.

hirnstroem 9. Aug 2007 13:15

Re: Windows Dienst + relative Pfadangaben
 
Okay, also Administratorenrechte sind für den Programmstart pflicht, dann sollte das Schreiben auch kein Problem sein.

Sehr sinnvoll ist es nicht Daten im Programmverzeichnis aufzuzeichnen, gewünscht wird es aber trotzdem -.-

Nun verwirrt mich das ganze aber noch immer.

Der Pfad, unter welchem die Bilder abgespeichert werden sollen ist über die Benutzeroberfläche konfigurierbar. Relative und absolute Pfade werden dabei beide akzeptiert. Im einen Fall wird das Bild folgendermassen abgespeichert (relativer Pfad):
Delphi-Quellcode:
imgReceived.Picture.Bitmap.SaveToFile('.\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp');
Mit absoluten Pfaden könnte das dann so ausschauen:
Delphi-Quellcode:
imgReceived.Picture.Bitmap.SaveToFile('C:Programme\Programm\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp');
Genau diese Strings werden auch in der Datenbank abgespeichert.

Beim Laden des Bildes sähe dies dann so aus:

Delphi-Quellcode:
imgKey.Picture.LoadFromFile('.\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp');
beziehungsweise:

Delphi-Quellcode:
imgKey.Picture.LoadFromFile('C:Programme\Programm\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp');
Ich ging davon aus dass der relative Pfad stets die Wurzel dort hat, wo die Applikation liegt. Beim Dienst ist dies aber scheinbar das System Verzeichnis. Wie dies umgebogen werden kann ist mir noch immer schleierhaft.

Grüsse
hirnstroem

thkerkmann 9. Aug 2007 13:23

Re: Windows Dienst + relative Pfadangaben
 
Zitat:

Zitat von hirnstroem
Ich ging davon aus dass der relative Pfad stets die Wurzel dort hat, wo die Applikation liegt. Beim Dienst ist dies aber scheinbar das System Verzeichnis. Wie dies umgebogen werden kann ist mir noch immer schleierhaft.

Grüsse
hirnstroem

Hi,

musst du ja nicht unbedingt umbiegen,
aber Du kannst mit Hilfe von z.B.
Delphi-Quellcode:
function GetModuleName: string;
var
  ModName: array[0..MAX_PATH] of Char;
begin
  SetString(Result, ModName,
    Windows.GetModuleFileName(HInstance, ModName, SizeOf(ModName)));
end;
Dir im Service den Pfad der Anwendung holen, mit

Delphi-Quellcode:
ExtraxtFilePath (GetModuleName)
abschneiden - und vor deine relativen Pfadangaben setzen.

Gruss

hirnstroem 9. Aug 2007 13:44

Re: Windows Dienst + relative Pfadangaben
 
Langsam dämmert es, oder es ist sogar schon hell.

Im Endeffekt müssen also alle Bilder über absolute Pfade abgespeichert werden, so einfach wäre es. Irgendwie habe ich aber den Verdacht, dass die wieder zu neuen Problemen führen wird.

Angenommen, die Bilder werden im Programmverzeichnis und mit absoluten Pfaden gespeichert (was vielleicht unschön aber trotzdem möglich ist). Nun wird der Programmordner verschoben und alte Daten sind dann plötzlich nicht mehr erreichbar. Mit relativen Pfaden hätte man dies schön umgehen können, da die Bilder ja mitverschoben würden und noch immer an demselben Ort erreichbar wären.

Bis jetzt wurden absolute Pfade nicht angenommen, wenn der gewählte Ordner sich im Programmverzeichnis befindet (um genau dieses Problem zu umgehen). Wenn die Bilder ausserhalb des Programmverzeichnisses gespeichert werden, sind wiederum relative Pfade Pflicht. So kann der Ordner in welchem sich die Applikation befindet nach belieben verschoben werden. Diese Abhängigkeiten sind mir irgendwie noch wichtig.


Abspeichern im Service sollte also genau mit folgender Zeile möglich sein:

Delphi-Quellcode:
imgReceived.Picture.Bitmap.SaveToFile('.\Log\2007\08\09\13_16_06_Addr_30_KEY.bmp');

SirThornberry 9. Aug 2007 14:06

Re: Windows Dienst + relative Pfadangaben
 
du kannst ja den relativen Pfad speichern. Aber für den aufruf von SaveToFile solltest du den relativen Pfad zu einem absoluten Pfad machen:
Delphi-Quellcode:
lPath := '.\datei.txt';
if (copy(lPath, 1, 2) = '.\') then
  lPath := ExtractFileName(Application.ExeName) + copy(lPath, 3, Length(lPath));
SaveToFile(lPath);

hirnstroem 9. Aug 2007 14:23

Re: Windows Dienst + relative Pfadangaben
 
Das macht Sinn.

Vielen Dank für die Hilfe!

Grüsse
hirnstroem

Christian Seehase 9. Aug 2007 15:33

Re: Windows Dienst + relative Pfadangaben
 
Moin Hirnstroem,

warum nimmst Du nicht einfach einen Pfad, der immer vorhanden sein sollte, und wo solche Daten dann auch hingehören, z.b. unterhalb von "All Users\Anwendungsdaten"
Die Basis dafür kannst Du dann mit SHGetspecialFolderPath auslesen.

hirnstroem 10. Aug 2007 06:05

Re: Windows Dienst + relative Pfadangaben
 
'loha Christian,

das ist eben so eine Geschichte. Auf jeden Fall wird gewünscht, die Daten überall abspeichern zu können. Je nach Einsatzgebiet und der Anzahl Geräte welche Bilder schicken - und das können theoretisch tausende sein - ist dann auch die Datenmenge relativ gross. Es handelt sich bei dem Ganzen um ein flexibles Zutrittskontrollsystem. Bei beispielweise 200 Leuten, welche 10 Mal pro Tag eine Türe öffnen beläuft sich das schon auf mehrere hundert Gigabyte pro Jahr. Diese werden wohl vorzugsweise auf einem Datenserver abgelegt oder wo auch immer. Für Anwendungsfälle mit kleinerem Umfang ist dies nicht nötig und da könnte es dann auch Sinn machen die aufgezeichneten Daten im Programmverzeichnis zu behalten. Die Daten werden aus Datenschutzgründen dann auch wieder gelöscht nach einer Weile.

Auf jeden Fall klappt das Speichern und Laden der Bilder jetzt wie gewünscht und die Vorgaben konnten eingehalten werden.

Grüsse
hirnstroem

Christian Seehase 10. Aug 2007 10:17

Re: Windows Dienst + relative Pfadangaben
 
Moin Hirnstroem,

dann könntest Du es noch konfigurierbar machen, und den Speicherpfad in der Registry eintragen (HKLM\Software).


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz