in reply to Re: Stumped with File::Find and -s
in thread Stumped with File::Find and -s

By erroneous answer, I mean I always get a value of around 55,300 + or - a little, even thought the directory may only have 4 files totaling 1800 bytes of less.

Replies are listed 'Best First'.
Re: Re: Re: Stumped with File::Find and -s
by BrowserUk (Patriarch) on Nov 22, 2002 at 02:41 UTC

    The problem, as identified by dws and tadman is that the use of File::Find is completely wrong.

    The line $File::Find::dir = $upload_dir; is having no effect whatsoever and is not intended for use this way.

    When you call find(), you are supplying the base of the subtree that the routine will search. As @ARGV will normally have no contents at all, or at least none that would be useful to you for this purpose, the @ARGV ? @ARGV : '.' almost certainly means that you are searching the subtree starting at '.', which is whatever place in the file system your CGI script is being invoked from.

    Your ../cgi-bin/ directory perhaps? This would explain why you are getting the same numbers back each time. To correct this, you need to supply the upload directory directly to the find() function.

    use File::Find; my $total_size = 0; find(sub { $total_size += -s }, $upload_dir );

    In the short-term, that may well cure your problem. In the long term, you really should read up on the use of taint, and starting checking that you have at least got something in the $email_address variable before blindly appending it to your upload path.

    You should seriously consider reading ovid's CGI programming course and pay special attention to lesson three unless you want your site to be overrun by the worlds script kiddies, because currently you are very vulnerable.


    Okay you lot, get your wings on the left, halos on the right. It's one size fits all, and "No!", you can't have a different color.
    Pick up your cloud down the end and "Yes" if you get allocated a grey one they are a bit damp under foot, but someone has to get them.
    Get used to the wings fast cos its an 8 hour day...unless the Govenor calls for a cyclone or hurricane, in which case 16 hour shifts are mandatory.
    Just be grateful that you arrived just as the tornado season finished. Them buggers are real work.

      Thanks for the advice. Per your suggestion the code was changed as below. The result was 5856 when it should be 1760(verified).
      #! Check Folder Size use File::Find; my $total_size = 0; find(sub { $total_size += -s }, $upload_dir ); if ($total_size > $maxfoldersize) { print"You have exceded your limit of $maxfoldersize KB for the directo +ry $email_address \n"; } #! End of Folder Check

        My best guesses are:

        1. $upload_dir doesn't contain what you think it contains.

          If $email_address is empty, something that your script as posted did not verify, then you would be performing the File::Find on the parent subdirectory.

          As File::Find processes the entire sundirectory tree starting at the subdir you give it, this would cause it to accumulate the filesizes of all the files in all the subdirectories below /home/bsexton/public_html/NEWClients/. You could verify this speculation by manually issuing an ls or du or whatever command on that directory and it's children and see if the number matches.

        2. The subdir you are checking itself contains other subdirs (or possibly symbolic links) and they are being included in the search by File::Find.

        These are just guesses. You are the only one who can eliminate them as possibilities and if they are incorrect, you will need to try a little lateral thinking of your own.


        Okay you lot, get your wings on the left, halos on the right. It's one size fits all, and "No!", you can't have a different color.
        Pick up your cloud down the end and "Yes" if you get allocated a grey one they are a bit damp under foot, but someone has to get them.
        Get used to the wings fast cos its an 8 hour day...unless the Govenor calls for a cyclone or hurricane, in which case 16 hour shifts are mandatory.
        Just be grateful that you arrived just as the tornado season finished. Them buggers are real work.

      Getting closer: As I stated above the code results in a value of 5856. However I just discovered if I remove the + sign from the += I get the value of the last file uploaded.
      use File::Find; my $total_size = 0; find(sub { $total_size = -s }, $upload_dir );
      For example I upload 4 files of 441, 441, 439, 439 bytes. The result without the + is 439 bytes. Can you shed any light on this??? Bob

        Suggestion: Modify the find in the following way. This will cause the names and sizes of the files found to be printed to STDERR. If you run your script locally from the command line and redirect STDOUT to a file or the null device, then you will see exactly what files are being found and sized.

        find(sub { print STDERR $_, -s, $/; $total_size = -s }, $upload_dir );

        If you have to run this remotely, the output should become part of your webserver log file. Take a look and see what files are being found, that should help you isolate the problem.


        Okay you lot, get your wings on the left, halos on the right. It's one size fits all, and "No!", you can't have a different color.
        Pick up your cloud down the end and "Yes" if you get allocated a grey one they are a bit damp under foot, but someone has to get them.
        Get used to the wings fast cos its an 8 hour day...unless the Govenor calls for a cyclone or hurricane, in which case 16 hour shifts are mandatory.
        Just be grateful that you arrived just as the tornado season finished. Them buggers are real work.

      Thanks for the advice. Per your suggestion the code was changed as below. The result was 5856 when it should be 1760(verified). #! Check Folder Size use File::Find; my $total_size = 0; find(sub { $total_size += -s }, $upload_dir ); if ($total_size > $maxfoldersize) { print"You have exceded your limit of $maxfoldersize KB for the directory $email_address \n"; } #! End of Folder Check