2008-10-23 7 views
18

पर्ल में अभी तक बनाई जाने वाली गंतव्य निर्देशिका पेड़ में फ़ाइलों की प्रतिलिपि बनाने का सबसे अच्छा तरीका क्या है? के बाद से निर्देशिका tardir/dest1/dest2 अभी मौजूद नहीं हैपर्ल में अभी तक बनने वाली निर्देशिका पेड़ में फ़ाइलों की प्रतिलिपि बनाने का सबसे अच्छा तरीका क्या है?

कुछ

तरह
copy("test.txt","tardir/dest1/dest2/text.txt"); 

काम नहीं करेगा। पर्ल में निर्देशिका निर्माण के साथ प्रतिलिपि बनाने का सबसे अच्छा तरीका क्या है?

उत्तर

27
use File::Path; 
use File::Copy; 

my $path = "tardir/dest1/dest2/"; 
my $file = "test.txt"; 

if (! -d $path) 
{ 
    my $dirs = eval { mkpath($path) }; 
    die "Failed to create $path: [email protected]\n" unless $dirs; 
} 

copy($file,$path) or die "Failed to copy $file: $!\n"; 
+1

तक चलने में सीपीएएन पर दोहरी जीवनशैली थी फ़ाइल :: पथ :: mkpath त्रुटि पर अपवाद फेंकता है ताकि आपका "या मर" सही न हो। – ysth

8
use File::Basename qw/dirname/; 
use File::Copy; 

sub mkdir_recursive { 
    my $path = shift; 
    mkdir_recursive(dirname($path)) if not -d dirname($path); 
    mkdir $path or die "Could not make dir $path: $!" if not -d $path; 
    return; 
} 

sub mkdir_and_copy { 
    my ($from, $to) = @_; 
    mkdir_recursive(dirname($to)); 
    copy($from, $to) or die "Couldn't copy: $!"; 
    return; 
} 
+0

corelist फ़ाइल के अनुसार :: पथ 5.001 के बाद से कोर का हिस्सा रहा है। –

+0

दिलचस्प। यह 5.10 में नहीं है, लेकिन यह पिछले संस्करणों में मौजूद है। –

+0

कोरलिस्ट संस्करण संख्याओं के लिए नोटेशन के बारे में एक छोटी छोटी गाड़ी है। "कोरलिस्ट-ए फाइल :: पथ" चलाएं और आप देखेंगे कि v2.04 को "5.01" (5.010 के बजाय) के साथ जारी किया गया था। –

5

File::Copy::Recursive :: fcopy() गैर-प्रमुख है, लेकिन) फ़ाइल :: पथ :: mkpath (जोड़ती है और फ़ाइल :: कॉपी :: प्रतिलिपि() कुछ में समाधान भी कम है, और बरकरार रखता है फ़ाइल :: कॉपी के विपरीत अनुमतियां। इसमें अन्य निफ्टी उपयोगिता कार्य भी शामिल हैं।

+0

यह संपर्क उपलब्ध विकल्पों में से सबसे आसान साबित हुआ। मैंने फ़ाइल :: कॉपी :: रिकर्सिव के डायरकोपी फ़ंक्शन का उपयोग करने का विकल्प चुना। 2 मुख्य फायदे यह हैं कि फ़ाइल :: कॉपी :: रिकर्सिव के फ़ंक्शन स्वचालित रूप से किसी भी डीआईआर को बनाएंगे। संरचना और प्रतिलिपि बनाते समय भी अनुमतियों को संरक्षित रखेगी। – slm

1

नकल करने के लिए अन्य उत्तर देखें, लेकिन निर्देशिका बनाने के लिए Path::Class उपयोग करने के लिए बहुत अच्छा है:

use Path::Class; 

my $destination_file = file('tardir/dest1/dest2/test.txt'); 
$destination_file->dir->mkpath; 

# ... do the copying here