[Lazarus] Multi-platform console application, how to handle file paths?

Michael Van Canneyt michael at freepascal.org
Tue Oct 29 12:43:51 CET 2019



On Tue, 29 Oct 2019, Bo Berglund via lazarus wrote:

> I am writing a console application intended to be portable between
> Windows and Linux and it uses files on the file system for
> configuration and also for processing data.
>
> Since the path delimiter is different on Unix and Windows I believe I
> have to handle this in my code, but how?
>
> I could create all paths inside the application using Windows
> delimiters and then upon usage send them to a "platform filter" like
> FixPlatformPath() below, which returns the string with the proper
> delimiters for the platform.
> Or else I have to check wherever the paths are dealt with and put
> conditionals inside the code in many places.
> Either way it feels a bit convoluted.
>
> Is there a better way?
>
> function FixPlatformPath(PathIn: string): string;
> begin
>  {$ifdef UNIX}
>    Result:= StringReplace(PathIn, '\', PathDelim, [rfReplaceAll]);
>  {$else}
>    Result:= StringReplace(PathIn, '/', PathDelim, [rfReplaceAll]);
>  {$endif}
> end;
>
> This would apply to all functions where files are handled such as
> reading config data, creating data files or reading data files etc...

1. Don't hardcode '/' or '\', use the PathDelim constant instead.
    You will not need any ifdefs.

2. FPC does not care whether you use '\' or '/', and windows normally will
accept '/' as well.

3. your "fixplatformpath' exists in FPC, in 2 forms:

    https://www.freepascal.org/docs-html/current/rtl/sysutils/dodirseparators.html
    https://www.freepascal.org/docs-html/current/rtl/sysutils/setdirseparators.html

    There are many routines that handle all this transparently:

    https://www.freepascal.org/docs-html/current/rtl/sysutils/filenameroutines.html

Michael.


More information about the lazarus mailing list