[lazarus] Wrong note in windows: Lazarus source directory notset

Vincent Snijders vslist at zonnet.nl
Sat Dec 20 15:53:18 EST 2003


On Sat, 20 Dec 2003 12:36:44 +0100
Mattias Gaertner <nc-gaertnma at netcologne.de> wrote:

> On Sat, 20 Dec 2003 12:27:00 +0100  Vincent Snijders
> <vslist at zonnet.nl> wrote:
> 
> > On Sat, 20 Dec 2003 12:00:20 +0100
> > Mattias Gaertner <nc-gaertnma at netcologne.de> wrote:
> > 
> > > On Fri, 19 Dec 2003 22:51:45 +0100  Vincent Snijders
> > > <vslist at zonnet.nl> wrote:
> > > 
> > > > Hi,
> > > > 
> > > > Lazarus gives a wrong note: Lazarus source directory not set,
> > > > even if it is set correctly. The reason is a difference in
> > > > behaviour of the FileExists function. 
> > > > 
> > > > Lazarus appends the directory seperator ('/' or '\' depending on
> > > > the platform) to path given by the user. Under linux FileExists
> > > > returns true for /my/lazarus/source/dir and
> > > > /my/lazarus/source/dir/. Under windows c:\my\lazarus\source\dir
> > > > returns true, but c:\my\lazarus\source\dir\ returns false.
> > > > 
> > > > IMO the most simple solution to solve this wrong not, would be
> > > > storing the dir without the appended directory seperator, but I
> > > > am not sure about the impact this would have for the rest of
> > > > lazarus.
> > > 
> > > Probably none. The IDE trims and adds path delimiters as it needs.
> > > So, deleting the path delimiter will neither break, nor fix it
> > > completely.
> > > 
> > > 
> > > > There might be simplier solutions.
> > > 
> > > I think, the only solution is to check all fileexists if they
> > > should be replaced by DirectoryExists. But there are a lot of
> > > places...
> > 
> > I 'll start replacing FileExists with DirectoryExists, since
> > DirectoryExists doesn't get upset from a append directory separator.
> 
> Why that?
> I added a ChompPathDelim to make sure.
At first I thought replacing FileExists with DirectoryExists would make
things work. 
To test things a bit further a made a testprogram:
program direxists;

{$mode objfpc}{$H+}

uses
  Classes, SysUtils;
  
var
  path: string;

begin
  path := ExtractFileDir(ParamStr(0));
  writeln(format('FPC version: %s',[{$I %FPCVERSION}]));
  writeln(format('DirectoryExists(''%s''): ',[path]),
    DirectoryExists(path));
  writeln(format('FileExists(''%s''): ',[path]),
    FileExists(path));
  path := path + DirectorySeparator;
  writeln(format('DirectoryExists(''%s''): ',[path]),
    DirectoryExists(path));
  writeln(format('FileExists(''%s''): ',[path]),
    FileExists(path));
end.

On linux the output for fpc 1.0.11 and fpc 1.9.1 is the same, it
doesn't matter if the name has a directory seperator appended:
DirectoryExists('/home/vsds/lazarus/projects/bugs/fileexists'): TRUE
FileExists('/home/vsds/lazarus/projects/bugs/fileexists'): TRUE
DirectoryExists('/home/vsds/lazarus/projects/bugs/fileexists/'): TRUE
FileExists('/home/vsds/lazarus/projects/bugs/fileexists/'): TRUE

On win32 the output depends on the fpc version:
FPC version: 1.0.11
DirectoryExists('V:\LAZARUS\PROJECTS\BUGS\FILEEXISTS'): TRUE
FileExists('V:\LAZARUS\PROJECTS\BUGS\FILEEXISTS'): TRUE
DirectoryExists('V:\LAZARUS\PROJECTS\BUGS\FILEEXISTS\'): TRUE
FileExists('V:\LAZARUS\PROJECTS\BUGS\FILEEXISTS\'): FALSE

FPC version: 1.9.1
DirectoryExists('V:\LAZARUS\PROJECTS\BUGS\FILEEXISTS'): TRUE
FileExists('V:\LAZARUS\PROJECTS\BUGS\FILEEXISTS'): TRUE
DirectoryExists('V:\LAZARUS\PROJECTS\BUGS\FILEEXISTS\'): FALSE
FileExists('V:\LAZARUS\PROJECTS\BUGS\FILEEXISTS\'): FALSE

Since I first tested with fpc 1.0.11, I thought replacing FileExists
with DirectoryExists would solve the incomptible behaviour between linux
and win32. But with fpc 1.9.1 that doesn't help.
There are two incompatibilities here:
1. FileExists doesn't behave the same on win32 and linux. (Is this a
bug?)
2. DirectoryExists doesn't behave the same on win32 for fpc 1.0.11
and fpc 1.9. (Is this a bug?)

So unless these incompatibilties are fixed (by the fpc team), we should
call DirectoryExists without appended directory seperator.

I see two ways to proceed then:
1. Making calls like
DirectoryExists(ChompPathDelim(EnvironmentOptions.LazarusDirectory))
2. In for example TEnvironmentOptions instead of  
  FLazarusDirectory:=AppendPathDelim(TrimFilename(AValue));
do 
  FLazarusDirectory:=ChompPathDelim(TrimFilename(AValue));

What do you prefer?

Regards,
Vincent.







More information about the Lazarus mailing list