[Mono-devel-list] Handling GetFullPath on Linux

Jonathan Gilbert 2a5gjx302 at sneakemail.com
Mon Nov 22 05:01:51 EST 2004


At 10:25 AM 22/11/2004 +0100, Jeroen wrote:
>Jonathan Gilbert wrote:
>> >This doesn't make sense. DirectorySeparatorChar and
>> >AltDirectorySeparatorChar should both be '/' on Linux. 
>> >Applications that hardcode a backslash are lame.
>> 
>> That doesn't stop people from writing them.
>
>Apps that can't even get this simple thing right are unlikely to work on
>Linux anyway. If Java taught us anything, it's that
>write-once-run-anywhere is doesn't work.

True enough.

>> >> I am not sure what to do about this. Which is more 
>> >> important, allowing UNIX escapes, or keeping compat?
>> >
>> >Surely allowing UNIX escapes is more important?
>> 
>> Aren't escape codes the job of the shell?
>
>Hmm. I didn't know that, but that would make sense. In any case, it
>would still be legal to use a backslash in a filename on Linux, by
>converting backslashes into slashes, that would be broken.

Path.GetFullPath() actually interacts with the underlying filesystem,
though, so the problem becomes more one of finding the closest
logically-consistent *existing* path leading up to the specified file. I
suggest that it would be best to first try for a path separated by '/'s
only. If that fails to produce ANY matching path components, try separating
by '\'s as well. If that DOES produce matching components, then use that
interpretation (i.e., translate the '\'s into '/'s for File.Open and such).
If it does not, however, I think it'd be best to make no assumptions about
the quality of the program and simply leave the string alone (that is,
append it to the current path as a relative subpath, using only the
platform's standard directory separator char(s)).

In pseudocode, this might be expressed as:

public static string GetFullPath(string path)
{
  if ('path' does not contain at least one existing component
      when only '/' is a separator)
    if ('path' *does* contain at least one existing component
        when both '/' and '\' are separators)
      return GetFullPath(path.Replace(@"\", "/");
    // else flow into the rest of the code

  attach 'path' onto current working directory;

  return the resulting absolute path;
}

Jonathan Gilbert




More information about the Mono-devel-list mailing list