howeyc/fsnotify

Detecting rename target

pwaller opened this issue · 1 comments

fsnotify looks well structured, but there is one thing which makes it not very useful at the moment: it's not possible to get the rename target, nor the raw notify events. I guess that this is to have a consistent interface across operating systems.

The problem with not telling me the rename target is that gedit (a text editor) actually doesn't modify the target file directly, but creates a new file and when it is complete replaces the target by renaming over it.

At the moment fsnotify outputs these events when I hit save:

event: "/path/to/dir/.goutputstream-7U75JW": CREATE
event: "/path/to/dir/.goutputstream-7U75JW": MODIFY
event: "/path/to/dir/.goutputstream-7U75JW": MODIFY
event: "/path/to/dir/.goutputstream-7U75JW": RENAME

The end result being that I don't know what file was modified by the editor.

It's not that I don't want to have this functionality. I really would, but I see no way to provide it.

FreeBSD/OSX - You need to open a file descriptor to watch it. The kevent does not specify the location of the file at all.
Look at EVFILT_NODE section of man page: http://www.freebsd.org/cgi/man.cgi?query=kqueue&apropos=0&sektion=0&manpath=FreeBSD+9.0-RELEASE&arch=default&format=html

Linux - Events are received for the directory you watch, so if you are not watching the target directory, you will only get the event coming out of the directory you are watching.
Man page for reference: http://linux.die.net/man/7/inotify
Now, you can watch individual files, but as far as I know, you can't get the destination location after a rename.

Windows - I am less familiar with this one, but it appears all changes are based on the directory, not even watching individual files. So again, you need to watch the target directory.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa365465(v=vs.85).aspx

I am hesitant to expose the underlying inotify event, because it makes the API less-consistent across operating systems and also because I'm not sure you'd gain the functionality you seek anyway.

Now, it may be possible that I have misread the documents, or there is some other way of doing this that I have not thought of. If I have missed something that will provide the rename functionality, please let me know. I'd be more than happy to rectify the situation.