in reply to Invalid top directory at C:/Perl/lib/File/Find.pm line 598

File::Find throws this exception when the second argument passed to find is undef. What's in @directories_to_search at that point?

(As a side note, Switch often makes for strange debugging sessions. It's been deprecated; you're far better off using smart match or if/else.)


Improve your skills with Modern Perl: the free book.

Replies are listed 'Best First'.
Re^2: Invalid top directory at C:/Perl/lib/File/Find.pm line 598
by Anonymous Monk on Sep 20, 2011 at 17:49 UTC

    Hi JHermida, what do you think, the following command in line 154 of your script does ?

    my @files = <"$inputDir"*>;

    Try to change it to

    my @files = glob "$inputDir*";

    if it's your intention to find all files beneath your top directory.

    And you can use Perl::Critic for quickly finding some strange behavior, it stated (for line 154, but there are some other suggestions):

    Glob written as <...> at line 154, column 14. See page 167 of PBP. Severity: 5

      It was my understanding that line 154 gets all files within the input directory. I got this from http://perl.about.com/od/filesystem/qt/perlglob.htm . Initially, I was writing this script on W7 and the line didn't include quotations, then I switched to an XP machine and had to include the quotations for it to work.

      I changed the line as you suggested, but the program enters an infinite loop.

      After some debugging, testing both lines:

      my @files = <"$inputDir"*>

      and

      my @files = glob "$inputDir*";

      only output the topic directory path, whereas

      my @files = <*>

      and

      my @files = glob "*";

      actually output the files within the present working directory.

        Maybe it's easier to change

        #find(\&processTimestamp, @directories_to_search);#$inputDir);

        to:

        find(\&processTimestamp, ($inputDir) );

        and delete the whole @directories_to_search initialisation.

Re^2: Invalid top directory at C:/Perl/lib/File/Find.pm line 598
by JHermida (Initiate) on Sep 20, 2011 at 17:22 UTC

    At that point, only the directory inputted by the user is in @directories_to_search. For example, if 'perl fileDateTime.pl "C:\Program Files"' was executed, @directories_to_search only contains the path "C:\Program Files".

    My initial thought of the find() function was that the second argument included all subdirectories within a parent directory, hence my code to get all files within the input directory, iterate through each, and add subdirectories to @directories_to_search. When I removed that block of code before, I realized that I could simply pass the input directory as the second argument to find(), but when I removed the code that deals with @directories_to_search, the program enters an infinite loop when a directory with no space is passed as the input directory (e.g., C:\drivers).