2010-04-08 29 views
79

मैं एक रिश्तेदार पथमैं कैसे जांच सकता हूं कि पर्ल में कोई फ़ाइल मौजूद है या नहीं?

$base_path = "input/myMock.TGZ"; 

myMock.TGZ फ़ाइल इनपुट फ़ोल्डर में स्थित नाम है। फ़ाइल नाम बदल सकता है। लेकिन पथ हमेशा $base_path में संग्रहीत किया जाता है।

मुझे यह जांचने की आवश्यकता है कि फ़ाइल $base_path में मौजूद है या नहीं।

उत्तर

128

परीक्षण करें कि कुछ दिए गए पथ पर मौजूद है -e फ़ाइल परीक्षण ऑपरेटर का उपयोग।

print "$base_path exists!\n" if -e $base_path; 

हालांकि, यह परीक्षण संभवतः आपके इरादे से व्यापक है। उपर्युक्त कोड आउटपुट उत्पन्न करेगा यदि उस पथ पर एक सादा फ़ाइल मौजूद है, लेकिन यह एक निर्देशिका, नामित पाइप, एक सिम्लिंक, या अधिक विदेशी संभावना के लिए भी आग लग जाएगी। विवरण के लिए See the documentation

आपके प्रश्न में .TGZ के विस्तार को देखते हुए, ऐसा लगता है कि आप विकल्पों की बजाय सादा फ़ाइल की अपेक्षा करते हैं। -f फ़ाइल-परीक्षण ऑपरेटर पूछता है कि कोई पथ एक सादे फ़ाइल की ओर जाता है या नहीं।

print "$base_path is a plain file!\n" if -f $base_path; 

perlfunc प्रलेखन Perl's file-test operators की लंबी सूची है कि आप व्यवहार में सामना करेंगे कई स्थितियों को शामिल किया गया शामिल हैं।

  • -r
    फ़ाइल प्रभावी uid/gid द्वारा पठनीय है।
  • -w
    फ़ाइल प्रभावी यूआईडी/ग्रिड द्वारा लिखने योग्य है।
  • -x
    फ़ाइल प्रभावी uid/gid द्वारा निष्पादन योग्य है।
  • -o
    फ़ाइल प्रभावी यूआईडी के स्वामित्व में है।
  • -R
    फ़ाइल वास्तविक यूआईडी/ग्रिड द्वारा पठनीय है।
  • -W
    फ़ाइल वास्तविक uid/gid द्वारा लिखने योग्य है।
  • -X
    फ़ाइल वास्तविक uid/gid द्वारा निष्पादन योग्य है।
  • -O
    फ़ाइल असली यूआईडी के स्वामित्व में है।
  • -e
    फ़ाइल मौजूद है।
  • -z
    फ़ाइल शून्य आकार (खाली है) है।
  • -s
    फ़ाइल में nonzero आकार (बाइट्स में आकार का आकार) है।
  • -f
    फ़ाइल एक सादे फ़ाइल है।
  • -d
    फ़ाइल एक निर्देशिका है।
  • -l
    फ़ाइल एक प्रतीकात्मक कड़ी (गलत सिमलिंक फाइल सिस्टम के द्वारा समर्थित नहीं कर रहे हैं) है।
  • -p
    फ़ाइल एक नामित पाइप (फीफो), या filehandle एक पाइप है।
  • -S
    फ़ाइल एक सॉकेट है।
  • -b
    फ़ाइल एक ब्लॉक विशेष फ़ाइल है।
  • -c
    फ़ाइल एक चरित्र विशेष फ़ाइल है।
  • -t
    फ़ाइलहेडल को एक tty के लिए खोला गया है।
  • -u
    फ़ाइल सेट सेट सेट है।
  • -g
    फ़ाइल setgid बिट सेट है।
  • -k
    फ़ाइल चिपचिपा बिट सेट है।
  • -T
    फ़ाइल एक ASCII या UTF-8 पाठ फ़ाइल (अनुमानी अनुमान) है।
  • -B
    फ़ाइल एक "बाइनरी" फ़ाइल (-T के विपरीत) है।
  • -M
    स्क्रिप्ट स्टार्ट टाइम माइनस फ़ाइल संशोधन समय, दिनों में।
  • -A
    एक्सेस समय के लिए ही।
  • -C
    inode परिवर्तन समय के लिए एक ही (यूनिक्स, अन्य प्लेटफार्मों के लिए अलग हो सकता है)
+0

हे बेकन, आपको देखकर अच्छा लगा। तो -एक सापेक्ष पथ के लिए भी काम करता है? मैंने सोचा कि यह केवल विशेष फ़ाइल के लिए काम किया है ... कूल धन्यवाद – superstar

+3

@ सुपरस्टार हैलो फिर से! हां, '-e' सापेक्ष पथ के साथ काम करता है, लेकिन मुझे लगता है कि मैंने आपके प्रश्न को गलत समझा होगा। क्या आपके पास * myMock.TGZ' नाम की एक * निर्देशिका * है, और आप जानना चाहते हैं कि उस निर्देशिका में एक विशेष नाम वाली फ़ाइल है या नहीं? उदाहरणों को शामिल करने के लिए अपने प्रश्न को संपादित करके आपको बेहतर उत्तर देने में हमारी सहायता करें! –

13
if (-e $base_path) 
{ 
# code 
} 

-e पर्ल में 'अस्तित्व' ऑपरेटर है।

आप this page पर कोड का उपयोग कर अनुमतियों और अन्य विशेषताओं की जांच कर सकते हैं।

+2

क्यों बजाय इन ऑपरेटरों के लिए आधिकारिक दस्तावेज से लिंक नहीं करना होगा का आनंद: यहाँ -f चेक, यह एक फ़ाइल या नहीं है? – Ether

+0

@ अन्य, सिर्फ इसलिए कि मैं अस्तित्व ऑपरेटर की खोज कर रहा था और यह मेरा पहला पृष्ठ मिला। PerlDoc शायद पीछे की ओर देखने में एक बेहतर विकल्प था। – mdm

12

आप उपयोग कर सकते हैं: if(-e $base_path)

+7

आप सामान्य फ़ाइल के परीक्षण के लिए '-f' का भी उपयोग कर सकते हैं (एक निर्देशिका या विभिन्न अन्य विशेष प्रकार की फ़ाइल के विपरीत) – justintime

29

आप का एक संस्करण चाहते हो सकता है मौजूद है ... perldoc -एफ "-एफ"

 -X FILEHANDLE 
     -X EXPR 
     -X DIRHANDLE 
     -X  A file test, where X is one of the letters listed below. This unary operator takes one argument, 
       either a filename, a filehandle, or a dirhandle, and tests the associated file to see if something is 
       true about it. If the argument is omitted, tests $_, except for "-t", which tests STDIN. Unless 
       otherwise documented, it returns 1 for true and '' for false, or the undefined value if the file 
       doesn’t exist. Despite the funny names, precedence is the same as any other named unary operator. 
       The operator may be any of: 

        -r File is readable by effective uid/gid. 
        -w File is writable by effective uid/gid. 
        -x File is executable by effective uid/gid. 
        -o File is owned by effective uid. 

        -R File is readable by real uid/gid. 
        -W File is writable by real uid/gid. 
        -X File is executable by real uid/gid. 
        -O File is owned by real uid. 

        -e File exists. 
        -z File has zero size (is empty). 
        -s File has nonzero size (returns size in bytes). 

        -f File is a plain file. 
        -d File is a directory. 
        -l File is a symbolic link. 
        -p File is a named pipe (FIFO), or Filehandle is a pipe. 
        -S File is a socket. 
        -b File is a block special file. 
        -c File is a character special file. 
        -t Filehandle is opened to a tty. 

        -u File has setuid bit set. 
        -g File has setgid bit set. 
        -k File has sticky bit set. 

        -T File is an ASCII text file (heuristic guess). 
        -B File is a "binary" file (opposite of -T). 

        -M Script start time minus file modification time, in days. 
9

उपयोग करें:

if (-f $filePath) 
{ 
    # code 
} 

-e फ़ाइल एक निर्देशिका है भले ही सत्य लौटती है। -f ही सच्चा वापसी करता है, तो यह एक वास्तविक फ़ाइल

5
#!/usr/bin/perl -w 

$fileToLocate = '/whatever/path/for/file/you/are/searching/MyFile.txt'; 
if (-e $fileToLocate) { 
    print "File is present"; 
} 
0

उपयोग नीचे दिए गए कोड है जाएगा।

print "File $base_path is exists!\n" if -f $base_path; 

और

3
if(-e $base_path){print "Something";} 

चाल

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

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