johannes
johannes

Reputation: 7272

How to acess ctime, mtime, … of a symbolic link?

On unix symlinks are pointers to another file. Not only the file but also the symlink has a ctime, mtime, …. I know the symlinks time can be accessed, as ls displays it. If I use one of ruby's File#ctime, File#mtime, …, I always get the attribute of the file the symlink is pointing to, not of the symlink. How can I read this values in ruby? If this is not possible in ruby, tell me how to do it in C. I would write my own c extension in that case.

Upvotes: 6

Views: 1873

Answers (3)

ysth
ysth

Reputation: 98398

There're not only the attributes of the symlink and the attributes of the final target, but also, if the symlink is itself to another symlink, one or more intermediate steps; to get all the attributes, you'd need to do lstats in a readlink loop.

Upvotes: 1

John Feminella
John Feminella

Reputation: 311605

Use File#lstat(). Example:

# This is a dummy symlink; there's no file named "foo".
ln -s foo bar

# Run irb.
irb(main):001:0> File.lstat("bar")
=> #<File::Stat dev=0x801, ino=90113, mode=0120777, nlink=1, uid=1000, gid=1000, rdev=0x0, size=3, blksize=4096, blocks=0, atime=2010-01-05 17:59:06 -0500, mtime=2010-01-05 17:59:05 -0500, ctime=2010-01-05 17:59:05 -0500>

# Get the mtime of the link.
irb(main):002:0> File.lstat("bar").mtime
=> 2010-01-05 17:59:05 -0500

Upvotes: 10

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 799082

lstat() can do it in C; not sure if there's a Ruby equivalent.

Upvotes: 1

Related Questions