Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: Re: File::Copy dying on Win2k when target file already there

by scain (Curate)
on Jan 16, 2003 at 21:24 UTC ( #227507=note: print w/ replies, xml ) Need Help??


in reply to Re: File::Copy dying on Win2k when target file already there
in thread File::Copy dying on Win2k when target file already there

Very sorry about the confusion. I had a little bit of a versioning problem. I modified the error message line after I pasted in the code for the script to get a more informative error message, and forgot to fix the code. The modified line looks like this:

copy($localfile, $installfile) or die "$localfile unable to copy to $installfile : $!\n";

That said, demerphq helped me track down the problem. The problematic files where read-only, and apparently File::Copy won't let you copy over read-only files (even if you are the Administrator). I modified the code to add lines like this:

fixreadonly($plugindir) if $^O =~ /win32/i; sub fixreadonly { my $dir = shift; my $unsetreadonly = Bio::Root::IO->catfile( $dir, "*.*"); system("attrib -r /s $unsetreadonly"); }

Scott
Project coordinator of the Generic Model Organism Database Project


Comment on Re: Re: File::Copy dying on Win2k when target file already there
Select or Download Code
Replies are listed 'Best First'.
Re: Re: Re: File::Copy dying on Win2k when target file already there
by John M. Dlugosz (Monsignor) on Jan 17, 2003 at 02:30 UTC
    You can change the attribute using chmod, built into Perl, instead of calling out to system. I tried it using the UNIX bits meanings, and it did indeed turn off the R flag on Windows NT.

    That works the same on both platforms, so you don't even have to make it conditional.

      John,

      I did as you suggested and it works well. The readdir/while loop in the code above now looks like this:

      opendir PLUGINS, "conf/plugins" or die "unable to opendir ./conf/plugi +ns\n"; while (my $pluginfile = readdir(PLUGINS) ) { my $localfile = Bio::Root::IO->catfile('conf/plugins',$pluginfile) +; if (-f $localfile) { my $installfile = Bio::Root::IO->catfile($plugindir, $pluginfi +le); chmod (0666, $installfile); copy($localfile, $installfile) or die "$localfile unable to copy to $installfile : $!\n"; chmod (0444, $installfile); } } closedir PLUGINS;
      The only caveat being that I had to chmod the files to 444 (readonly by everyone, including the owner (root in this case)). It is fine for Windows, but an annoyance on unix. I would have preferred 644 (writeable by the owner), but on Windows, that is the same as world writeable (from Perl's chmod perspective).

      (I hate having to type :w and then :w! when I am reminded once again that the file is readonly.)

      Thanks,

      Scott
      Project coordinator of the Generic Model Organism Database Project

        I guess the chmod on Windows is using the "word" write bit as the single read-only flag.

        You could conditionally note the value to use, once:

        use constant ROFLAG => $^O eq 'MSWin32' ? 0444 : 0644;
        and then use that constant in your code.

        I don't know what you mean about typing :w.

        —John

        First of all, in reply to John M. Dlugosz, please don't use eq: use constant ROFLAG => $^O =~ /win32/i ? 0444 : 0644;

        There is too much legacy code that does so already. If everyone used a regex $^O could be changed to contain more details about the exact version of Windows.

        However, this solution strikes me as an ugly hack anyway. How about this?

        chmod +(stat)[2] | 0444, $_ for $installfile;

        Makeshifts last the longest.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://227507]
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: (13)
As of 2015-07-28 10:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (254 votes), past polls