Dateizugriff Windows

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
rami
Beiträge: 4
Registriert: Sa 19. Sep 2009, 16:53

Dateizugriff Windows

Beitrag von rami »

Hallo!
Ich lese bei meinem Programm mit folgender Routine die Sprache aus der Konfigurationsdatei (achtung, im initialization-Teil (muss so sein!)):

Code: Alles auswählen

if FileExists(ExtractFilePath(GetAppConfigFile(false))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(GetAppConfigFile(false))+'cookiepascal.conf'
else if FileExists(ExtractFilePath(GetAppConfigFile(true))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(GetAppConfigFile(true))+'cookiepascal.conf'
else
     cfgfile := ExtractFilePath(ParamStr(0))+'cookiepascal.conf';
 
Assign(init_F, cfgfile);
Reset(init_F);
While not eof(init_F) do begin
	readln(init_F, init_tmp);
	if trim(init_tmp) <> '' then begin
		init_Posi := Pos(' ', init_tmp);
		init_title := Copy(init_tmp, 0, (init_Posi-1));
		init_value := Copy(init_tmp, (init_Posi+1), 9999);
 
		if init_title = 'lang' then init_lang := init_value;
	end;
end;
 
if FileExists('/usr/share/cookiepascal/lang/CookiePascal.'+init_lang+'.po') then
	lngfile := '/usr/share/cookiepascal/lang/CookiePascal.'+init_lang+'.po'
else if FileExists(ExtractFilePath(ParamStr(0))+'lang/CookiePascal.'+init_lang+'.po') then
	lngfile := ExtractFilePath(ParamStr(0))+'lang/CookiePascal.'+init_lang+'.po'
else if FileExists('/usr/share/cookiepascal/lang/CookiePascal.po') then
	lngfile := '/usr/share/cookiepascal/lang/CookiePascal.po'
else if FileExists('lang/CookiePascal.po') then
	lngfile := 'lang/CookiePascal.po';
Funktioniert unter Linux auch wunderbar. Unter Windows beschwerte sich der Debugger über den Slash in den Pfaden, also habe ich den Code angepasst:

Code: Alles auswählen

cfgfile := 'bla';
{$IFDEF WINDOWS}
if FileExists(ExtractFilePath(GetAppConfigFile(false))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(GetAppConfigFile(false))+'cookiepascal.conf'
else if FileExists(ExtractFilePath(ParamStr(0))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(ParamStr(0))+'cookiepascal.conf'
else if FileExists('cookiepascal.conf') then
     cfgfile := 'cookiepascal.conf';
{$ELSE}
if FileExists(ExtractFilePath(GetAppConfigFile(false))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(GetAppConfigFile(false))+'cookiepascal.conf'
else if FileExists(ExtractFilePath(GetAppConfigFile(true))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(GetAppConfigFile(true))+'cookiepascal.conf'
else if FileExists(ExtractFilePath(ParamStr(0))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(ParamStr(0))+'cookiepascal.conf'
else if FileExists('cookiepascal.conf') then
     cfgfile := 'cookiepascal.conf';
{$ENDIF}
 
if cfgfile <> 'bla' then begin
{$I-}
Assign(init_F, cfgfile);
Reset(init_F);
While not eof(init_F) do begin
	readln(init_F, init_tmp);
	if trim(init_tmp) <> '' then begin
		init_Posi := Pos(' ', init_tmp);
		init_title := Copy(init_tmp, 0, (init_Posi-1));
		init_value := Copy(init_tmp, (init_Posi+1), 9999);
 
		if init_title = 'lang' then init_lang := init_value;
	end;
end;
{$I+}
end else begin
    init_lang := 'en';
end;
 
{$IFDEF WINDOWS}
if FileExists(ExtractFilePath(ParamStr(0))+'lang\CookiePascal.po') then
	lngfile := ExtractFilePath(ParamStr(0))+'lang\CookiePascal.po'
else if FileExists('lang\CookiePascal.po') then
	lngfile := 'lang\CookiePa[code=laz]
scal.po';
{$ELSE}
if FileExists('/usr/share/cookiepascal/lang/CookiePascal.'+init_lang+'.po') then
lngfile := '/usr/share/cookiepascal/lang/CookiePascal.'+init_lang+'.po'
else if FileExists(ExtractFilePath(ParamStr(0))+'lang/CookiePascal.'+init_lang+'.po') then
lngfile := ExtractFilePath(ParamStr(0))+'lang/CookiePascal.'+init_lang+'.po'
else if FileExists('/usr/share/cookiepascal/lang/CookiePascal.po') then
lngfile := '/usr/share/cookiepascal/lang/CookiePascal.po'
else if FileExists(ExtractFilePath(ParamStr(0))+'lang/CookiePascal.po') then
lngfile := ExtractFilePath(ParamStr(0))+'lang/CookiePascal.po'
else if FileExists('lang/CookiePascal.po') then
lngfile := 'lang/CookiePascal.po';
{$ENDIF}[/code]
Jetzt gibt es Probleme ("RunError(5)") bei der Zeile "Assign(init_F, cfgfile);". Im Internet las ich, das hieße so viel wie "Access denied". Aber wie geht das? Die Datei existiert, ist nicht schreibgeschützt, liegt auf einer FAT-Partition und ist nicht rechtemäßig eingeschränkt. Sie wurde auch von meinem Benutzerkonto erstellt.
Kommentiere ich das ganze aus und packe ins FormCreate folgenden Code, bekomme ich als MessageBoxen einmal den Pfad (zu einer Datei die genau unter diesem Pfad zu 100% existiert!) und einmal "-1", also die Angabe, die Datei würde nicht existieren.

Code: Alles auswählen

if FileExists(ExtractFilePath(GetAppConfigFile(false))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(GetAppConfigFile(false))+'cookiepascal.conf'
else if FileExists(ExtractFilePath(ParamStr(0))+'cookiepascal.conf') then
     cfgfile := ExtractFilePath(ParamStr(0))+'cookiepascal.conf'
else if FileExists('cookiepascal.conf') then
     cfgfile := 'cookiepascal.conf';
ShowMessage(cfgfile);
ShowMessage(booltostr(FileExists(cfgfile)));
Wie kann das bitteschön sein? Wäre sehr dankbar, wenn jemand eine Idee hätte!

Den kompletten Code des Projekts gibt es hier im SVN, allerdings ohne die Anpassungen mit {$IFDEF WINDOWS}, die oben zu sehen sind.

Benutzeravatar
theo
Beiträge: 10952
Registriert: Mo 11. Sep 2006, 19:01

Re: Dateizugriff Windows

Beitrag von theo »

Hast du Sonderzeichen (Umlaute etc.) im Pfad?
http://wiki.lazarus.freepascal.org/LCL_ ... _filenames" onclick="window.open(this.href);return false;

rami
Beiträge: 4
Registriert: Sa 19. Sep 2009, 16:53

Re: Dateizugriff Windows

Beitrag von rami »

Die beiden Pfade, die geprüft werden:

Code: Alles auswählen

D:\sandbox\lazarus\fpcgui\cookiepascal.conf
C:\Dokumente und Einstellungen\Mein Name mit Leerzeichen\Anwendungsdaten\Cookie Pascal\cookiepascal.conf
Also: Nein.

Benutzeravatar
theo
Beiträge: 10952
Registriert: Mo 11. Sep 2006, 19:01

Re: Dateizugriff Windows

Beitrag von theo »

Da kommst du schon noch drauf.
Übrigens: das Resultat -1 bei BoolToStr bedeutet "true", "false" wäre 0;
BoolToString gibt auch true/false zurück, wenn man es so benützt:
BoolToStr(<TestAusdruck>,true);

Ansonsten kann ich dir noch raten:
Statt kompliziert mit Assign und Pos zu arbeiten, nimm doch einfach eine TStringList:

Code: Alles auswählen

sl:=TStringList.create;
sl.LoadFromFile('blah');
sl.NameValueSeparator:=' '; //Falls ungleich =
init_title := sl.Values['lang'];
sl.free;
Macht genau das gleiche. ;-)

TIniFile geht auch.

rami
Beiträge: 4
Registriert: Sa 19. Sep 2009, 16:53

Re: Dateizugriff Windows

Beitrag von rami »

theo hat geschrieben:Da kommst du schon noch drauf.
Übrigens: das Resultat -1 bei BoolToStr bedeutet "true", "false" wäre 0;
Hey danke, das kannte ich von anderen Sprachen so extrem umgekehrt bzw anders ;-)
Ich werde mal deinen Code einfügen und testen, sobald ich mal wieder unter windows bin!

Benutzeravatar
theo
Beiträge: 10952
Registriert: Mo 11. Sep 2006, 19:01

Re: Dateizugriff Windows

Beitrag von theo »

rami hat geschrieben: Hey danke, das kannte ich von anderen Sprachen so extrem umgekehrt bzw anders ;-)
Echt? In welcher Sprache ist "0" nicht "false" und demzufolge alles andere "true"?

rami
Beiträge: 4
Registriert: Sa 19. Sep 2009, 16:53

Re: Dateizugriff Windows

Beitrag von rami »

theo hat geschrieben:
rami hat geschrieben: Hey danke, das kannte ich von anderen Sprachen so extrem umgekehrt bzw anders ;-)
Echt? In welcher Sprache ist "0" nicht "false" und demzufolge alles andere "true"?
Dochdoch, 0=false kenne ich schon, aber dass true != 1 ist, war für mich Neuland.

Antworten