Entwickler-Ecke

Dateizugriff - File wird nicht erkannt


Mitmischer 1703 - Do 04.02.10 20:00
Titel: File wird nicht erkannt
Hi DF!

Ich stehe momentan vor einem für mich unlösbaren Problem. Ich habe im Programmverzeichnis ein INI-File, Setup.ini. Dieses File existiert DEFINITIV, aber ich bekomme jedes Mal eine Exception geworfen (verwende Windows 7):


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:
31:
32:
33:
34:
procedure TMainForm.FormCreate(Sender: TObject);
var Ini : TIniFile; PhraseCount : Integer;
  I: Integer;
begin
  try
   PerformSysCheck;
   // Ini öffnen
   ShowmEssage(ExtractFilePath(ParamStr(0))+'Setup.ini'); // alles ok mit dem Pfad
   if not FileExists(ExtractFilePath(ParamStr(0))+'Setup.ini'then
    raise Exception.Create('File not found');
   Ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'Setup.ini');
   // Zahl der Texte auslesen
   PhraseCount := Ini.ReadInteger('Options''PhraseCount', -1);
   SetLength(FPhrases, PhraseCount);
   // Texte auslesen
   for I := 0 to PhraseCount - 1 do
    FPhrases[I] := Ini.ReadString('Phrases', IntToStr(I), 'Error');
   // Rules.pas
   PageControl1.SelectNextPage(true, false);
   // Label-Array füllen
   SetLength(Labels, 8);
   Labels[0] := Welcome;
   Labels[1] := Sys_Check;
   Labels[2] := Setuptype;
   Labels[3] := Path;
   Labels[4] := Components;
   Labels[5] := Summary;
   Labels[6] := Install;
   Labels[7] := Lbl_ready;
  except
   ShowMessage(StrErrorDuringInit);
   Application.Terminate
  end;
end;


Was kann ich da machen?


Gausi - Do 04.02.10 20:29

Bekommst du die FileNotFound-Exception, oder eine andere? Ich vermute nämlich letzteres.

TIniFile verwendet ja die Windows-Inifile-API, und es kann gut sein, dass da unter Win7 mit den Zugriffsrechten was schiefläuft, wenn dein Programm im Programme-Ordner liegt (C:\program files\ ...).

Mit TMemIniFile sollte der (Lese)zugriff klappen, probier das mal aus.


DonManfred - Fr 05.02.10 15:06

user profile iconMitmischer 1703 hat folgendes geschrieben Zum zitierten Posting springen:
Hi DF!

Delphi-Quelltext
1:
   ShowmEssage(ExtractFilePath(ParamStr(0))+'Setup.ini'); // alles ok mit dem Pfad                    

Was kann ich da machen?


AFAIK ist ParamStr(0) der Pfad UND Dateiname der eigenen EXE... Demnach suchst Du also z.B. nach C:\Programme\Testprogramm\test.exeSetup.ini

Ungetestet; hab ich grad so im Kopf...

Ich hol mir den Pfad immer mit


Delphi-Quelltext
1:
2:
3:
  own_path := ExtractFilePath(Application.ExeName);
  if own_path[Length(own_path)] <> '\' then
    own_path := own_path + '\';


Hope it helps


FinnO - Fr 05.02.10 16:16

nope. der extractfilepath ist schon korrekt.


platzwart - Fr 05.02.10 17:11

Also ich benutze das auch immer so: ExtractFilePath(ParamStr(0))+'\data\data.dat'


FinnO - Fr 05.02.10 18:24


Delphi-Quelltext
1:
showmessage(extractFilePath(ParamStr(0)));                    


liefert bei mir in Delphi 2010 ein Ergebnis MIT schließendem Backslash.


DonManfred - Fr 05.02.10 19:07

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
nope. der extractfilepath ist schon korrekt.


Ok, kann durchaus sein, das ich den Code so in der Form schon seit Jahren (und über diverse Delphi-Versionen hinweg) benutze... Ich muss da mal probleme gehabt haben ;)
*nachguck* Yo, laut Doku (Delphi 2006) liefert ExtractFilePath den Pfad mit abschliessendem Backslash.

Dann wäre es interessant, WELCHE exception gemeldet wird (wurde weiter oben ja auch schonmal angefragt).


Mitmischer 1703 - Fr 05.02.10 19:12

Die geworfene Exception ist meine eigene ;)

Hab's vielleicht missverständlich ausgedrückt, aber ich werfe - wenn die INI nicht da ist eine Exception.

Und ich den Test rausfallen lasse, geht das Createn der INI gut - doch bei PhraseCount gibts den Default-Wert!

Hab meine INI mal hochgeladen - ist da was falsch?

Edit: Mom, glaub, ich hab meinen Fehler gefunden

Tatsächlich... Ich hatte "Erweiterungen bei bekannten Dateitypen ausblenden an" :wand:

Jetzt müsste der Code eig funzen, wenn nicht, meld ich mich nochmal!