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

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.

Replies are listed 'Best First'.
Re: Re: Re: Re: Stumped with File::Find and -s
by bsexton1qBob Sexton (Novice) on Nov 22, 2002 at 11:52 UTC
    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
Re: Re: Re: Re: Stumped with File::Find and -s
by bsexton1qBob Sexton (Novice) on Nov 22, 2002 at 11:54 UTC
    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.

        The $email_address is verified in the input form and I also tried hard coding a directory name('TEST'). There are also no othr directories under NEWClients. Since it is my hosting company, I don't have access to the command line to do a du or ls, unless I do it in the script. I did however ftp the directories back to my PC and checked them. Nothing comes close to the value.
Re: Re: Re: Re: Stumped with File::Find and -s
by bsexton1qBob Sexton (Novice) on Nov 24, 2002 at 16:57 UTC
    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.

        Hello, I ran as you said. The values listed below.
        .4096 BandWPainting1.htm441 BandWPainting2.htm441 ColorPainting1.htm43 +9 ColorPainting2.htm439
        The 441+441+439+439 = 1760, which is what I am looking for. The 4096 + 1760 = 5856. is the erroneous value I reported. Is the '.' mean it is reading the hidden area?