2009-08-25 20 views
8

यदि आपके पास फ़ाइल का पथ है (उदाहरण के लिए, /home/bob/test/foo.txt) जहां पथ में प्रत्येक उपनिर्देशिका मौजूद हो या न हो, तो मैं फ़ाइल को foo.txt कैसे बना सकता हूं "/home/bob/test/foo.txt" का उपयोग केवल एक ही पथ में प्रत्येक गैर-निर्देशिका निर्देशिका बनाने के बजाय एकमात्र इनपुट के रूप में करता है और अंत में foo.txt स्वयं बना देता है?पर्ल में एक शॉट में मैं अपनी सभी उपनिर्देशिकाओं के साथ पथ कैसे बना सकता हूं?

उत्तर

23

आप का उपयोग File::Basename और File::Path

use strict; 
use File::Basename; 
use File::Path qw/make_path/; 

my $file = "/home/bob/test/foo.txt"; 
my $dir = dirname($file); 
make_path($dir); 
open my $fh, '>', $file or die "Ouch: $!\n"; # now go do stuff w/file 

मैं अगर फ़ाइल पहले से मौजूद है, लेकिन है कि पर्ल के साथ जोड़ने के लिए बहुत आसान है देखने के लिए किसी भी परीक्षण में नहीं जोड़ा था कर सकते हैं।

+0

मुझे लगता है कि आप 'mkpath', नहीं' make_path' मतलब है? अन्यथा, अच्छा जवाब। – hobbs

+2

@ हॉब्स: 'फ़ाइल :: पथ' के लिए दस्तावेज़ों की जांच करें। 'mkpath' को "विरासत" के रूप में वर्णित किया गया है, और नया इंटरफ़ेस उस फ़ंक्शन के लिए' make_path' का उपयोग करता है। – Telemachus

+1

आह, यह एक हालिया परिवर्तन है। मेरे पास संस्करण में इंटरफ़ेस नहीं है। :) – hobbs

3

उपयोग make_dir from File::Util

use File::Util; 
    my($f) = File::Util->new(); 
    $f->make_dir('/var/tmp/tempfiles/foo/bar/'); 

    # optionally specify a creation bitmask to be used in directory creations 
    $f->make_dir('/var/tmp/tempfiles/foo/bar/',0755); 
2

मैं वहाँ एक मानक समारोह है कि फ़ाइल नाम से सीधे आप क्या पूछना सभी कर सकते हैं, है नहीं लगता।

लेकिन mkpath(), मॉड्यूल फ़ाइल :: पथ से, लगभग फ़ाइल नाम की निर्देशिका को दे सकता है। फ़ाइल :: पथ डॉक्स से:

"mkpath" समारोह निर्देशिका बनाने के लिए एक सुविधाजनक तरीका प्रदान, भले ही आपके "mkdir" कर्नेल कॉल पर निर्देशिका के एक से अधिक स्तर नहीं बना होगा एक वक़्त।

ध्यान दें कि mkpath() त्रुटियों को एक अच्छी तरह से रिपोर्ट नहीं करता है: किसी कारण से, यह केवल शून्य लौटने की बजाय मर जाता है।

सब देखते हुए, आप की तरह कुछ कर सकता:

use File::Basename; 
use File::Path; 

my $fname = "/home/bob/test/foo.txt"; 

eval { 
    local $SIG{'__DIE__'}; # ignore user-defined die handlers 
    mkpath(dirname($fname)); 
}; 
my $fh; 
if ([email protected]) { 
    print STDERR "Error creating dir: [email protected]"; 
} elsif (!open($fh, ">", $fname)) { 
    print STDERR "Error creating file: $!\n"; 
} 
+1

अंतर्निहित कोड लगभग दो दशकों पुराना है, और तब से प्रोग्रामिंग फैशन बहुत बदल गए हैं। आप पुरानी शैली फ़ाइल :: पथ इंटरफ़ेस का उपयोग कर रहे हैं। नया इंटरफ़ेस आपको सभी त्रुटियों को पकड़ने और उचित (या अनदेखा) के साथ सौदा करने की अनुमति देता है। – dland

+0

पता है कि वहां एक नया इंटरफ़ेस है। मुझे पोर्टेबल पर्ल लिखने के लिए उपयोग किया जाता है जो पुराने संस्करणों और ओएस के पार (इसलिए, दो-बहस खुला()) के लिए काम करता है, इसलिए मैं आमतौर पर पर्ल में नया क्या सीखकर खुद को चिढ़ाता हूं। :-) –

+1

@ माइकल: मैं समझता हूं कि आपको किसी भी कारण से पुराने पर्ल लिखने की आवश्यकता हो सकती है, लेकिन मुझे समझ में नहीं आता कि आप इस तरह के कोड को दूसरों के लिए उदाहरण क्यों पोस्ट करेंगे। यदि आप 'ओपन' के तीन-तर्क रूप से अवगत हैं, तो कृपया इसे यहां चारों ओर उपयोग करें। हमें दो-तर्क फ़ॉर्म के नेट पर अधिक उदाहरणों की आवश्यकता नहीं है; हमारे पास पहले से कहीं ज्यादा है। – Telemachus

संबंधित मुद्दे