Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: Any way to determine path being monitored with Win32::ChangeNotify?

by Athanasius (Archbishop)
on Nov 13, 2014 at 03:16 UTC ( [id://1107048]=note: print w/replies, xml ) Need Help??


in reply to Anyway to determine path being monitored with Win32::ChangeNotify?

Hello PhillyR,

With the ls utility from GnuWin tools you can use ls -i to get the inode of the monitored directory. If the user subsequently renames the directory, its inode number remains unchanged, allowing you to identify the directory and retrieve its new name.1 Here is some proof-of-concept code (minus error checking!):

#! perl use strict; use warnings; my $dir = 'foo'; my $ls = (grep { /\s+$dir$/ } `ls -il`)[0]; $ls =~ /^\s*(\d+)/; my $inode = $1; print "$dir --> $inode "; rename $dir, 'bar'; $ls = (grep { /^\s*$inode\s+/ } `ls -il`)[0]; $ls =~ /:\d{2}\s+(.*)$/; print "--> $1\n";

Output:

13:09 >perl 1076_SoPW.pl foo --> 7318349394599033 --> bar 13:09 >

(Tested on an NTFS file system under Windows 8.1, 64-bit.)

Hope that helps,

1See this discussion.

Athanasius <°(((><contra mundum Iustus alius egestas vitae, eros Piratica,

Replies are listed 'Best First'.
Re^2: Any way to determine path being monitored with Win32::ChangeNotify?
by BrowserUk (Patriarch) on Nov 13, 2014 at 07:26 UTC

    I'm really baffled by how your example works, as NTFS doesn't have inode numbers?

    (See the output from stat & lstat, where the inode number is always 0.)

    From what I can tell by looking at the ls.c (from the GnuWin project), it (same.c) uses the st_ino field returned by stat:

    #define SAME_INODE(Stat_buf_1, Stat_buf_2) \ ((Stat_buf_1).st_ino == (Stat_buf_2).st_ino \ && (Stat_buf_1).st_dev == (Stat_buf_2).st_dev) static bool dev_ino_compare (void const *x, void const *y) { struct dev_ino const *a = x; struct dev_ino const *b = y; return SAME_INODE (*a, *b) ? true : false; }

    Which is (in my machine) always 0.


    With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      Hello i'm baffled too (but learned new word: baffled) because i knew inode was always 0 on windows.. but effectively the version suggested by Athanasius, ie gnuwin32 return some number while unxutils return 0.
      >touch test.txt > > >which ls.exe >C:\various_stuffs\bin\UnxUtils\usr\local\wbin\ls.exe > >ls -il test.txt 0 -rw-rw-rw- 1 user group 0 Nov 13 09:57 test.tx +t >C:\some_path\GnuWin32\bin\ls.exe -il test.txt >3377699722053632 -rw-rw-rw- 1 lt 0 0 2014-11-13 09:57 test.txt >

      Can someone tell us if we can use reliably this inode number?

      Thanks
      L*
      There are no rules, there are no thumbs..
      Reinvent the wheel, then learn The Wheel; may be one day you reinvent one of THE WHEELS.
        but effectively the version suggested by Athanasius, ie gnuwin32 return some number

        Hm. I've spent an hour going through the ls.c trying to work out what that number might be, but I've failed to find anything that looks a likely source.

        One thing I do know is that it isn't a true inode number, cos they simply do not exist!.

        Which can only mean that they are making it up, though I can't see where.

        I also cannot think of any reliable way to do so. If the based it upon some kind of hashing of the other stat/lstat information, it would change everytime the file was read/written/changed/renamed/....

        Is the number consistent between runs of the gnuwin/ls executable?


        With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
        Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
        "Science is about questioning the status quo. Questioning authority".
        In the absence of evidence, opinion is indistinguishable from prejudice.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1107048]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (5)
As of 2024-04-25 12:23 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found