Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer
 
PerlMonks  

Re^3: how to handle the warnings in a find statement

by huck (Parson)
on Dec 19, 2016 at 11:54 UTC ( #1178059=note: print w/replies, xml ) Need Help??


in reply to Re^2: how to handle the warnings in a find statement
in thread how to handle the warnings in a find statement

Being an administrator and running with elevated permissions are not the same thing

More about these "magic dirs", can be found here under junctions https://msdn.microsoft.com/en-us/library/windows/desktop/aa365006(v=vs.85).aspx and here https://msdn.microsoft.com/en-us/library/windows/desktop/aa365503(v=vs.85).aspx

It seems file::find sees them as a normal direcory, and doesnt have the permissions to "reparse" them.

edited to add: see also readlinkL under http://search.cpan.org/~rboisvert/Win32-LongPath-1.03/lib/Win32/LongPath.pm and Re: Trouble with File::Find::Rule

  • Comment on Re^3: how to handle the warnings in a find statement

Replies are listed 'Best First'.
Re^4: how to handle the warnings in a find statement
by Aldebaran (Chaplain) on Dec 20, 2016 at 09:12 UTC

    Thanks all for responses, and I have more perl reading than time, which will suit my dental cleaning appointment just fine tomorrow. I've skimmed what was posted mod one and taken what I thought most relevant for scripts moving forward. Right now, I'm drawing cpan errors with my strawberry perl install. I'm putting this output between readmore tags again along with the new source listing the way windows sees it.

    The way I see it is that I was doing alright. I believe to have cleared the cpan dependencies, but see complaints that look like things a C compiler says. Perl on windows 10 is such an odd platypus that I can't think of where C libraries are and how to remediate that.

    Update

    Source listing and errors:

    C:\Users\Fred>type virus6.pl #!/usr/bin/perl use warnings; use strict; use File::Find; use Cwd; my $current = cwd; find( \&pm_beneath, $current, ); sub pm_beneath { use File::Basename; use 5.01; my $file = $File::Find::name; my $ref_to_file = \$file; my $days = .1; #hard-coded my $basename = basename($file); return if $file =~ /.*AppData.*/; use Fcntl ':mode'; use Win32::LongPath qw(:funcs :fileattr); # get object testL ('e', $file) or die "$file doesn't exist!"; $stat = statL ($file) or die ("unable to get stat for $file ($^E)"); # this test for directory $stat->{mode} & S_IFDIR ? print "Directory\n" : print "File\n" +; # is the same as this one $stat->{attribs} & FILE_ATTRIBUTE_DIRECTORY ? print "Directory +\n" : print "File\n"; # show file times as local time printf "Created: %s\nAccessed: %s\nModified: %s\n", scalar localtime $stat->{ctime}, scalar localtime $stat->{atime}, scalar localtime $stat->{mtime}; my $access_age = -M $basename; return if ( $access_age > $days ); print "$file\n"; printf "$basename: M age in days: %.4f\n\n", $access_age; say "ref to file is $ref_to_file"; } __END__ C:\Users\Fred>perl virus6.pl Can't locate Win32/LongPath.pm in @INC (you may need to install the Wi +n32::LongPath module) (@INC contains: C:\Users\Fred\Documents\perl5\l +ib\perl5/5.24.0/MSWin32-x64-multi-thread C:\Users\Fred\Documents\perl +5\lib\perl5/5.24.0 C:\Users\Fred\Documents\perl5\lib\perl5/MSWin32-x6 +4-multi-thread C:\Users\Fred\Documents\perl5\lib\perl5 C:\Users\Fred\ +perl5\lib\perl5/5.24.0/MSWin32-x64-multi-thread C:\Users\Fred\perl5\l +ib\perl5/5.24.0 C:\Users\Fred\perl5\lib\perl5/MSWin32-x64-multi-threa +d C:\Users\Fred\perl5\lib\perl5 C:/Strawberry/perl/site/lib C:/Strawb +erry/perl/vendor/lib C:/Strawberry/perl/lib .) at virus6.pl line 22. BEGIN failed--compilation aborted at virus6.pl line 22. C:\Users\Fred>

      Wow

      Im not sure you realize that the "wanted" sub gets passed directories too. i often have a return unless (-f $file); in there.

      another thing the wanted sub can do is signal to prune the tree. $File::Find::prune = 1 is a signal to File::Find not to follow a directory. You want to prune junction points.

      # this test for directory $stat->{mode} & S_IFDIR ? print "Directory\n" : print "File\n" +; # is the same as this one $stat->{attribs} & FILE_ATTRIBUTE_DIRECTORY ? print "Directory +\n" : print "File\n"; my $isjunction= <.. some code to see if its a junction ..> ; if ($isjunction){ $File::Find::prune = 1 return; }
      now you may even be able to contrive a test <.. some code to see if its a junction ..> that does not require "use Win32::LongPath", i dont know what it is now. Otherwise i think you are stuck trying to install that module. , sorry

        https://github.com/rdboisvert/Win32-LongPath is the repository for this module. I'm almost glad for the opportunity to clone this, as using git was part of the exercises for _Intermediate Perl_, as well as using find statements. The readme says to dmake the product:

        What this shows is the exact same litany of errors I got yesterday with cpan. This will mean something to a prognosticator. Let me first trot out the actual command:

        gcc -c  "-I." "-I."     -s -O2 -DWIN32 -DWIN64 -DCONSERVATIVE  -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -fwrapv -fno-strict-aliasing -mms-bitfields -Wall -W -Wno-comment -s -O2       -DVERSION=\"1.07\"    -DXS_VERSION=\"1.07\" -o xs\LongPath.o  "-IC:\STRAWB~1\perl\lib\CORE"  -DUSE_PPPORT -DWINVER=0x0a00 -D_WIN32_WINNT=0x0a00 xs\LongPath.c

        I know C well enough to see that this seems syntactic, whilst not really knowing more than half of the flags. (You tell me what -DCONSERVATIVE is, and I'll be impressed.) The first errors cite hv.h, which seems to be how perl defines hashes. I believe this is how perl pre-declares C to achieve that data structure:

        The way I read it, gcc fails in the early phases because we've got the warnings/strictness dialed up pretty darn high. So I'm twice a loser with installing this mod, once with cpan, u takzhe dmaking as per README. So those are my woes that I offer undo the gods of perl. I didn't wash out completely, though and cleared one variety of diagnostic by inclusion of:

        return unless (-f $file);

        But I achieved something else with the part of the script that doesn't depend on cpan. I downloaded the module at pi time, and put it in my local::lib for strawberry perl, which was set to "My Documents". Lo and behold, they are showing up only under 'Documents', so the warning that I can't open the directory "My Documents" doesn't correspond to something that went unsearched. I'd still like to handle the event so my script is clear of warnings.

        As a bonus insight, I got to see where the machine model for C stopped. It's close to M = .19 in these data:

        Seek help with LongPath.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (6)
As of 2019-12-16 09:55 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?