[Mono-dev] Mono.Unix - UnixDirectoryInfo.IsSymbolyicLinkquestion

Paddy Joy patrick.joy2 at mail.dcu.ie
Mon Oct 3 19:37:22 EDT 2005

Thanks for the background info and help, it all makes a lot more sense now. 
I'm using UnixSymbolicLinkInfo now and getting the correct results.

So am I correct in saying that if you have a UnixDirectoryInfo object the 
IsSymbolicLink property will never be set to true because it will always 
reference the sym link target or is it the case that if the symlink target 
is another symlink then it will be set to true?

Also since we are on the subject of UnixDirectoryInfo :-) Is the 
GetFileSystemEntries() method a implementation of the 
DirectoryInfo.GetDirectories() for the linux filesystem or is it something 
completly different?


----- Original Message ----- 
From: "Jonathan Pryor" <jonpryor at vt.edu>
To: "Paddy Joy" <patrick.joy2 at mail.dcu.ie>
Cc: <mono-devel-list at lists.ximian.com>
Sent: Monday, October 03, 2005 9:56 PM
Subject: Re: [Mono-dev] Mono.Unix - 

> On Mon, 2005-10-03 at 20:50 +1000, Paddy Joy wrote:
>> I have a directory /home/paddy/test which contains one sub-directory and
>> one symbolic link:
>> [root at localhost test]# ls -lh
>> total 12K
>> drwxr-xr-x  2 root root 4.0K Oct  3 20:38 directory
>> lrwxrwxrwx  1 root root    4 Oct  3 20:39 SYMLINK -> /tmp
>> -rw-r--r--  1 root root  535 Oct  3 20:41 test.cs
>> -rwxr-xr-x  1 root root 3.5K Oct  3 20:41 test.exe
>> [root at localhost test]#
>> When I run the following code:
> <snip/>
>> I get the output:
>> /home/paddy/test/directory
>> False
>> /home/paddy/test/SYMLINK
>> False
>> Should I get True for the symbolic link /home/paddy/test/SYMLINK? Am I
>> misunderstanding the meaning of the property IsSymbolicLink or is it
>> just my dodgy code?
> It's either your misunderstanding or my dodgy code. :-)
> Background: there are three system calls to get status information:
> stat(2), fstat(2), and lstat(2).  fstat(2) works on file descriptors, so
> who cares (see UnixStream)?   stat(2) and lstat(2) both accept file
> names, the difference being their behavior when given symbolic links:
> stat(2) will implicitly "dereference" the symbolic link(s), giving you
> status information for the *target* file; lstat(2) will give you
> information about the symbolic link *itself*.
> Why's this matter?  Because UnixFileInfo and UnixDirectoryInfo call
> stat(2), and thus will always "dereference" any symbolic links given to
> them.  UnixSymbolicLinkInfo, on the other hand, uses lstat(2), and thus
> will return IsSymbolicLink=True for:
> Console.WriteLine("IsSymbolicLink=" +
> new UnixSymbolicLinkInfo("/home/paddy/test/SYMLINK")
> .IsSymbolicLink);
> One potential point of confusion is that, while UnixFileInfo and
> UnixDirectoryInfo always refer to the symlink target, they don't update
> the FullName (and related) properties to also refer to the symlink
> target.  I thought this was a good idea at the time, since getting the
> Parent directory would return the "logical" parent instead of the
> target's parent, but perhaps that isn't a good idea.  Or perhaps
> everything else should return the results of stat(2), but IsSymbolicLink
> should return the results of lstat(2)...
> Regardless, unless the current design changes (I'm open to suggestions),
> if you care about symbolic links you should use UnixSymbolicLinkInfo,
> and you can use UnixSymbolicLinkInfo.Contents to get a
> UnixFileSystemInfo instance for the symlink target.  Note that this is
> only one "indirection" -- if the target is itself a symlink (pointing to
> another symlink, pointing to another symlink...),
> UnixSymbolicLinkInfo.Contents will return another UnixSymbolicLinkInfo
> instance, and you can manually walk the symlink "chain".
> Alternatively, if you don't care about the chain after the first
> indirection, create a UnixFileInfo/UnixDirectoryInfo instance over
> UnixSymbolicLinkInfo.ContentsPath.  (How you figure out if it's a file
> or a directory without walking the entire chain is up to you, or I add
> another property to UnixSymbolicLinkInfo.
> IsTargetFile/IsTargetDirectory, anyone?)
> - Jon

More information about the Mono-devel-list mailing list