SPUG: Yet another silly question

Yitzchak Scott-Thoennes sthoenna at efn.org
Mon Jan 21 23:25:07 CST 2002


In article <a05101206b8721ee64c05@[64.255.216.47]>,
Jason Lamport <jason at strangelight.com> wrote:
>At 8:10 am -0800 1/21/02, Pommert, Daniel wrote:
>>I have found that mkpath will check to see if the directory is there before
>>it tries to create it.  So, checking is not necessary when using mkpath.
>
>Is this behaviour in the documentation for File::Path, or is this 
>simply something you've observed?  I personally consider it poor 
>programming practice to rely on undocumented behaviour, even in 
>trivial cases such as this. (And even if it is part of the formal 
>spec, an extra check rarely hurts.)

I have File::Path version 1.0404 here.
It does indeed skip directories that already exist.  It returns a list
of directories created (including intermediates).  In scalar context,
this is a count of directories created.  So if you say mkpath("$base/$dir"...)
and $base/$dir already exists it returns 0.  So in the suggested code below,
the die is triggered.  Worse yet, since no system error actually occured,
the value of $! is meaningless.  Indeed, an extra check rarely hurts.

>>So, the code below would better be written:
>>
>>#!/usr/bin/perl -w
>>#
>>$dir = "some/directory/path";
>>$base = "/usr/people/moonbeam";
>>
>>use File::Path;
>>
>>if ( ! -f "$base/$dir" ) {
>>     mkpath("$base/$dir", 0, 0755 ) or
>>         die "Cannot make $dir/$base - $!\n";
>>}
>>else {
>>     print STDERR, "$base/$dir already exists as a file!\n";

s/,//

>>}

I'm also not sure what the point is of printing a warning (but not via
warn) if $base/$dir already exists as a file but dying if if any of
the intermediates exist as a file.  (BTW, mkpath already does a die if
a mkdir fails.  The only case I see that *will* hit the die above is
if the directory already exists.)

You might try something like this:
my $makeme = "$base/$dir";  # portably, use = File::Spec::->catfile($base,$dir)
eval { mkpath($makeme,0,0755) };
warn "Error making path $makeme: ", ($@ || "race condition") unless -d $makeme;

 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     POST TO: spug-list at pm.org       PROBLEMS: owner-spug-list at pm.org
      Subscriptions; Email to majordomo at pm.org:  ACTION  LIST  EMAIL
  Replace ACTION by subscribe or unsubscribe, EMAIL by your Email-address
 For daily traffic, use spug-list for LIST ;  for weekly, spug-list-digest
     Seattle Perl Users Group (SPUG) Home Page: http://zipcon.net/spug/





More information about the spug-list mailing list