windows - mkpath mangler hvis bibliotek allerede eksisterer?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at debug et problem på en vens maskine.
Jeg skrev et script til at kopiere over nogle filer, og scriptet bruger mkpath (jeg ved, at mkpath er aftagende og nu er der make\_path, men jeg bruger en ældre version af perl). [17]


På min maskine (med samme version af perl og operativsystem mv.) Fungerer scriptet fint selv under de betingelser, hvor katalogerne allerede findes.


Imidlertid,


Når jeg forsøger at køre scriptet på min venes maskine, kaster mkpath en fejl, når der bliver kaldt på allerede eksisterende kataloger!


Fejlen det kaster er 'mkdir: Filen eksisterer'


Jeg er meget stumped om hvorfor scriptet virker på min maskine, men ikke hans.


Tak
Farid


EDIT FØLGE MERE NØGLIG INFO



Okay, så her er nogle flere ting, der hjælper med at diagnosticere dette problem



  1. Vi bruger den samme version af Perl og File. Begge er gemt på et Perforce repository, så vi er 100\% ved hjælp af samme version

  2. Jeg kopierer filerne til et fælles netværk. Derfor er filepath af typen: \NETWORK-COMP/Directory1/Directory2/Directory3

  3. Scriptet løber gennem en masse filer og kopierer dem over. første filen er altid med succes kopieret, men den anden fil mislykkes med fejlen


    mkdir \ NETWORK-COMP/Directory1 Filen findes



Directory1 er ikke en fil, og det er faktisk en GUID, og ​​der er ingen kollisioner (jeg tjekker dobbelt hver gang)!

Bedste reference


Jeg formoder, at en del af stien eksisterer, men det er ikke en mappe.


$ echo foo >foo

$ perl -MFile::Path -e'mkpath "foo"'
mkdir foo: File exists at -e line 1





En anden mulighed er, at de to maskiner har forskellige versioner af File :: Path, og man har en fejl i den. Hvis det er tilfældet, kan du bare opgradere File-Path. [18]





En tredje mulighed er, at du giver dårlig input på en af ​​maskinerne. Jeg får


mkdir PATH: File exists


men du får


mkdir : File exists


Det kunne være på grund af en forskel i versionen, men det tror jeg ikke på grund af pladsen før ':'. Kontrollér dit input ved hjælp af Data :: Dumper (efter at have lavet $Data::Dumper::Useqq = 1;) for at gøre sikker på at du passerer, hvad du tror, ​​du går forbi. [19]

Andre referencer 1


Samme OS? Samme version af Perl? Hmm ....


Jeg har set denne fejlmeddelelse, når der er en eksisterende fil i den sti, den forsøger at oprette. For eksempel forsøger jeg at oprette mappen foo/bar/bar/foo, men der er en fil foo/bar/bar, mkpath vil mislykkes med den fejlmeddelelse, du sagde.


Er det muligt, at dette var tilfældet? Prøv dette lille testprogram på din computer:


Kør følgende kommando på begge systemer:


$ perldoc -lm File::Path


Dette vil udskrive placering i det fil :: Path-modul, der er inkluderet. Min mistænkning er, at du ikke udfører fil-path-modulet, du tror, ​​du er.


Når du har bestemt de faktiske moduler, der bruges, skal du kontrollere, om de to moduler er enige. Også, mens du er ved det, skal du gøre en perl -V (det er en hovedstad V). Det vil give dig en masse oplysninger om dine Perl-installationer, herunder libpath, posix bruges. Det er meget muligt, at du kompilerede Perl med samme kildekode, men kompilere flag varierede.


Prøv dette testprogram på begge systemer:


use strict;
use warnings;
use File::Path;

open (FOO, ">foo") or die qq(Things really aren't going your way
);
print FOO "THIS
";
close FOO;

if (my $value = mkpath "foo/foo/bar/foo") {
    print "It worked: $value !
";
} else {
    print "It didn't: $value !
";
}
print "And the program continues
";


Dette skal mislykkes, fordi jeg 'skaber en fil foo og derefter forsøger at lave en sti foo/boo/bar/foo. Faktisk får jeg følgende fejl:


mkdir foo: File exists at ./test.pl line 11


En af disse ting vil give os et fingerpeg om, hvad der foregår.