Zitat von Michael Van Canneyt <[email protected]>:



On Tue, 9 Feb 2010, Paul van Helden wrote:


On 2010/02/09 02:48 PM, Mattias Gärtner wrote:
Zitat von Paul van Helden <[email protected]>:


Good. What is the recommended function for the inverse process?

I don't know for the ExtractRelativePath, but for CreateRelativePath it is simple:

AbsolutePath:=AppendPathDelim(ABasePath)+RelPath


I'm talking specifically about /relative/ paths, ie. ones with ../../../ in them.

[...]
 - ExpandFileName()
[...]
 - CleanAndExpandFilename()
 - CleanAndExpandDirectory()


Graeme: you also missed this. None of those functions take a base path and applies a relative path to produce a new absolute path. The function must be able to go up some directories and then down some others.

ExpandFileName does exactly that.

No. ExpandFilename does much more and less. It corrects \ and / to path delim, expands a relative filename with the *current working directory* (Get/SetCurrentDir) and it expands tilde '~' to $HOME under Linux.

If you want only create an absolute path from a directory and a relative path use:
AbsPath:=AppendPathDelim(BaseDir)+RelPath;

This can create a file like '/usr/../lib' or '/usr/./lib' or '/usr//lib', which are all valid file names, just somewhat ugly.
To resolve '..', '.' and double path delims use TrimFilename:

AbsPath:=TrimFilename(BaseDir+PathDelim+RelPath);

The above three would result in '/usr/lib'.

To even resolve system specials like '~' and cut trailing path delim use CleanAndExpandFilename:

AbsPath:=CleanAndExpandFilename(BaseDir+PathDelim+RelPath);

CleanAndExpandDirectory is like CleanAndExpandFilename but appends a path delim if not already there.

If you even want to resolve symlinks or get the real file name (e.g. OS X UTF8 normalization, case insensitive file systems) there are functions for that too.


Mattias



--
_______________________________________________
Lazarus mailing list
[email protected]
http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus

Reply via email to