Entwickler-Ecke

Dateizugriff - Pfad zu einer Anwendung aus einer INI Datei lesen


greeger - Mo 31.03.08 18:10
Titel: Pfad zu einer Anwendung aus einer INI Datei lesen
Hallo,

erneut stellt sich mir eine Frage mit dem Umgang von INI-Dateien.
Mein Programm soll aus einer bestehenden INI Datei und dem in dieser Datei angegebene Pfad zu einer Exe auslesen und in einem Label anzeigen. Wenn der Pfad nicht erxestiert wird dies in der Oberfläche kenntlich gemacht.
Dieses funktioniert auch bei mir jedoch nicht mit Exe-Namen die aus zwei oder mehr Wörtern bestehen z.B. Microsoft Word.exe
Wenn die Exe lediglich Word.exe benannt ist zeigt mein Programm das Ordnungsgemäß an.

Das folgende Beispiel kommt nicht aus meinem Quelltext beschreibt aber mein Problem.


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
  begin  if FileExists('C:\Datei.exe'then    
  Showmessage('Datei vorhanden');
end;


Wenn das Programmaufruf aber so Aussieht geht dies nicht...


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
  begin  if FileExists('C:\Datei test.exe'then    
  Showmessage('Datei vorhanden');
end;


Hat da jemand eine Idee zu wie ich das Leerzeichen ignorieren kann?


nagel - Mo 31.03.08 18:17

Probier's mal mit Anführungszeichen drumrum, also if FileExists('"C:\Datei test.exe"').


greeger - Mo 31.03.08 18:28

Leider ist das nicht so einfach...
Die INI-Dateien sind nicht von mir erstellt worden d.h. mein Programm macht folgendens vielleicht wird es "klarer"

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  Initest:=TIniFile.Create(form1.edt_p_ini_pfad.text);//Hier wählt der Benutzer die INI Datei aus
  parameterx1:=Initest.ReadString('Allgemein','Prog','');//Hier Pfad zur beliebigen Anwendung in der INI Datei
    if FileExists(parameterx1) then //Hier prüfe ich ob es das file gibt
      begin
        form1.Img_prog_false.Visible:=false;
        form1.Img_prog_ok.Visible:=true;
        form1.l_p_e_prog.Caption:=parameterx1;
      end
        else
      begin
          form1.Img_prog_false.Visible:=true;
          form1.Img_prog_ok.Visible:=false;
          form1.img_prog_false.ShowHint:=true;
          form1.img_prog_false.Hint:='Bitte angegebene Pfad zum Programm prüfen';
          form1.l_p_e_prog.Caption:=parameterx1;
      end;


in der INI Datei kann also alles mögliche drin stehen.

Wenn in der INI Datei z.B. c:\Programme\notepad.exe" drin steht sagt mein Programm die Datei gibt es (obwohl das nicht stimmt wegen den ")
Ein weiteres Problem ist das angegebene c:\Programme\ms notepad.exe hier geschieht das gleiche wegen dem Leerzeichen.

Wenn aber z.B. c:\Programme"\ms notepad.exe drin steht dann bekomme ich die richtige Meldung


galagher - Mo 31.03.08 18:40

Kann es sein, dass dir QuotedStr weiterhilft?


greeger - Mo 31.03.08 18:49

Habe es gerade mal ausprobiert. Leider keinen Erfolg.
Hab mal einem Label den Wert zugewiesen damit ich weiß was in der Variablen drin stehet.
Es wird zwar durch die Funktion QuotedStr ein (') am Anfang und ein (') am ende zu gefügt jedoch steht dann in der Variablen 'c:\programme\ms notepad.exe'
diesen Pfad gibt es natürlich nicht und folglich sagt mein Programm der angegebene Pfad zur EXE stimmt nicht.

***Haare rauf***


galagher - Mo 31.03.08 19:49

Und

Delphi-Quelltext
1:
if (FileExists('"Die ausgelesene Datei"')) or (FileExists('Die ausgelesene Datei'))                    

Geht das?
Ansonsten muss ich sagen: Pfad ist Pfad, bei Leerzeichen " verwenden... Oder? :eyecrazy:


greeger - Di 01.04.08 11:04

Hallo galagher,

leider brachte deine Idee nicht den gewünschten Erfolg.
Ich muss eine andere Lösung finden. Es ist wichtig ob das Programm mit anzeigt ob der Pfad + die EXE Datei tatsächlich, wie in der INI-Datei eingetragen, vorhanden ist.
Aber trozdem mal danke bis hier her...
Falls ich eine Lösung gefunden habe poste ich die mal hier...

mfg greeger

PS.: falls natürlich jemand anderes noch eine Idee hat probiere ich die gerne mal...


jaenicke - Di 01.04.08 11:22

Also ich kann das nicht nachvollziehen, bei mir funktioniert FileExists korrekt, egal ob mit oder ohne Leerzeichen...
Welche Delphi- und Windows-Version benutzt du?


greeger - Di 01.04.08 12:00

Hallo,

ich nutze Delphi7 und WXP SP2.

Anbei mal den Auszug aus der INI_Datei und den entsprechnden Screenshot meines Programmes. Vielleicht hilft das.

//Start INI-Datei

[Allgemein]
Prog = C:\custo\custo med\Exe\custo manager.exe

//noch weitere Einträge in der INI Datei

Und hier der Screenshot


Wenn ich aber den Programmaufruf in der INI-Datei wie folgt anpasse

//Start INI Datei
[Allgemein]
Prog = C:\custo\custo med\Exe\custo manager.exe"

dann sagt mein Programm das der Pfad und dir EXE exestieren. Siehe INI2-jpg


greeger - Di 01.04.08 15:20

Mal ne Frage,

kann es sein das Fileexist nur auf drei Stellen hinter dem Punkt schaut? Also z.B. *.123
Wenn das so wäre dann würde das mein Problem erkären.


galagher - Mi 02.04.08 19:53

user profile icongreeger hat folgendes geschrieben:
kann es sein das Fileexist nur auf drei Stellen hinter dem Punkt schaut? Also z.B. *.123

Nein. Datei D:\Delphi6\Projects\1234567890.1234567890 erstellt und getestet mit

Delphi-Quelltext
1:
2:
if FileExists('D:\Delphi6\Projects\1234567890.1234567890'then
 Memo1.Lines.LoadFromFile('D:\Delphi6\Projects\1234567890.1234567890');

- und es funktionierte.


jaenicke - Fr 04.04.08 06:11

Also bei mir funktioniert es mit Delphi 7 genauso wie mit Delphi 2006, auch mit einer Ini-Datei, ich kann das ebenfalls nicht nachvollziehen. Könntest du vielleicht ein Testprojekt anhängen bitte?


SiegfriedXX - Mo 07.04.08 00:27

Diesen post bitte löschen hab ausversehen doppelt gepostet und sehe keine löschfunktion schade


SiegfriedXX - Mo 07.04.08 00:28

Hier die lösung womit es gehen sollte

binde als aller erstes funktionen und prozedur ein (eine zum lesen und eine zum schreiben von ini dateien falls dud as auch bruachst)



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
//--------------------------------------------
// INI Dateien laden und speichern
//--------------------------------------------


function TForm1.DoReadINI(const strFile,strWhichSection,strString:string): string;
 var
    ReadINI : TINIFile;
begin
try
    ReadINI := TINIFile.Create(strFile);
    result := ReadINI.ReadString(strWhichSection, strString, 'Default');
    finally
    ReadINI.Free;
end;
end;



procedure TForm1.DoWriteINI(const strFileWRI,strWhichSectionWRI,strNameWRI,strStringWRI:string);
 var
    WriteINI : TINIFile;
begin
try
    WriteINI := TINIFile.Create(strFileWRI);
    WriteINI.WriteString(strWhichSectionWRI, strNameWRI, strStringWRI);
    finally
    WriteINI.Free;
end;
end;


in die uses kommt folgendes:


Delphi-Quelltext
1:
uses iNIFiles;                    



nun kannst du mit dem befehl die ini aufrufen

Delphi-Quelltext
1:
DoReadINI('DEINFILENAME.ini','SUCHENDER TEXT in [KLAMMERN]','DEN WERT DES TEXTES'); //Rückgabewert ist das was hinter dem = dann steht                    




die ini datei könnte so aussehen DATEINAME is mal system.ini

[Visual]
HIGH_EFFECT=0
HIGH_EFFECT2=0
POSTPROCESS_BRIGHTNESS=32
TEXTURELOD=0
WATEREFFECT=0
GRASSRENDERING=0
SHADOW=0
RESOLUTIONWIDTH=800
RESOLUTIONHEIGHT=600
TERRAINLOD=0
GAMMA=0


nun könnte man also nach den einzelnen zahlen suchen z.b. Shadow


Delphi-Quelltext
1:
DoReadINI('system.ini','Visual','shadow');  //Rückgabe hier würde die 0 sein denn das was hinter dem = steht wird genommen egal ob leerzeichen oder sonst was                    



ich hoffe hab dir geholfen


fuba - Sa 07.06.08 10:37

hallo greeger,

ich habe mal 2 Dateien auf C: erstellt "Datei.exe" und "Datei Test.exe"
Also 1x mit Leerzeichen und 1x ohne.

Meine Test ini sieht so aus:

Quelltext
1:
2:
3:
4:
5:
;inhalt der Datei Project1.ini
[Files]
File1 = C:\Datei.exe
File2 = C:\Datei test.exe
File3 = C:\Programme\Microsoft.NET\Primary Interop Assemblies\Microsoft.mshtml.dll


mein code:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
Ini := TIniFile.Create(changefileext(paramstr(0), '.ini'));
with ini do
begin
  if FileExists(ReadString('Files''File1''')) then
  showmessage('File1 gefunden'else showmessage('File1 nicht gefunden');
  
  if FileExists(ReadString('Files''File2''')) then
  showmessage('File2 gefunden'else showmessage('File2 nicht gefunden');

  if FileExists(ReadString('Files''File3''')) then
  showmessage('File3 gefunden'else showmessage('File3 nicht gefunden');
end;
Ini.Free;


und bei mir funktioniert das auch mit Leerzeichen ohne probleme.