Perl'de bir dosya olup olmadığını nasıl kontrol edebilirim?


112

Göreceli bir yolum var

   $base_path = "input/myMock.TGZ";

myMock.TGZgirdi klasöründe bulunan dosya adıdır. Dosya adı değişebilir. Ancak yol her zaman içinde saklanır $base_path.

Dosyanın içinde var olup olmadığını kontrol etmem gerekiyor $base_path.

Yanıtlar:


179

Dosya testi operatörünü kullanarak belirli yolda bir şey olup olmadığını -etest edin.

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

Ancak, bu test muhtemelen sizin düşündüğünüzden daha geniştir. Yukarıdaki kod, bu yolda düz bir dosya varsa çıktı üretir, ancak aynı zamanda bir dizin, adlandırılmış bir kanal, bir sembolik bağlantı veya daha egzotik bir olasılık için de tetiklenir. Ayrıntılar için belgelere bakın.

Sorunuzdaki uzantısı göz önüne alındığında, alternatifler yerine sade bir dosya.TGZ bekliyorsunuz gibi görünüyor . Dosya test operatörü bir yol düz bir dosyaya yol açar sorar.-f

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

Perlfunc belgeleri , uygulamada karşılaşacağınız birçok durumu kapsayan Perl'in dosya testi operatörlerinin uzun listesini kapsar.

  • -r
    Dosya, etkin uid / gid ile okunabilir.
  • -w
    Dosya, etkin uid / gid ile yazılabilir.
  • -x
    Dosya, etkin uid / gid tarafından çalıştırılabilir.
  • -o
    Dosya, etkin kullanıcı kimliğine aittir.
  • -R
    Dosya gerçek uid / gid tarafından okunabilir.
  • -W
    Dosya gerçek uid / gid ile yazılabilir.
  • -X
    Dosya gerçek uid / gid tarafından çalıştırılabilir.
  • -O
    Dosya gerçek kullanıcı kimliğine aittir.
  • -e
    Dosya var.
  • -z
    Dosya sıfır boyuta sahip (boş).
  • -s
    Dosyanın boyutu sıfırdan farklıdır (boyutu bayt cinsinden döndürür).
  • -f
    Dosya düz bir dosyadır.
  • -d
    Dosya bir dizindir.
  • -l
    Dosya sembolik bir bağdır (sembolik bağlar dosya sistemi tarafından desteklenmiyorsa yanlıştır).
  • -p
    Dosya, adlandırılmış bir kanaldır (FIFO) veya Dosya İşleyicisi bir kanaldır.
  • -S
    Dosya bir sokettir.
  • -b
    Dosya, özel bir blok dosyadır.
  • -c
    Dosya, karaktere özel bir dosyadır.
  • -t
    Filehandle bir tty'ye açılır.
  • -u
    Dosyada setuid bit seti var.
  • -g
    Dosya setgid bit setine sahip.
  • -k
    Dosyada yapışkan bit ayarlanmış.
  • -T
    Dosya bir ASCII veya UTF-8 metin dosyasıdır (sezgisel tahmin).
  • -B
    Dosya bir "ikili" dosyadır (tersi -T).
  • -M
    Komut dosyası başlangıç ​​zamanı eksi dosya değiştirme süresi, gün cinsinden.
  • -A
    Erişim süresi için aynı.
  • -C
    İnode değiştirme zamanı için aynı (Unix, diğer platformlar için farklılık gösterebilir)

hey pastırma, seni görmek güzel. yani -e göreceli bir yol için bile çalışıyor? sadece belirli bir dosya için işe yaradığını düşündüm ... harika teşekkürler
süperstar

3
@superstar Tekrar merhaba! Evet, -egöreceli yollarla çalışır, ancak sorunuzu yanlış anlamış olabilirim. Eğer bir var mı dizin adında myMock.TGZve bu dizin belli bir isme sahip bir dosya içerip içermediğini bilmek istiyorum? Sorunuzu örnekler içerecek şekilde düzenleyerek size daha iyi yanıtlar vermemize yardımcı olun!
Greg Bacon

29

Varoluşun bir varyantını isteyebilirsiniz ... perldoc -f "-f"

      -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
               doesnt 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.

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

-e Perl'deki 'varoluş' operatörüdür.

Bu sayfadaki kodu kullanarak izinleri ve diğer öznitelikleri kontrol edebilirsiniz .


3
Bunun yerine neden bu operatörler için resmi belgelere bağlantı vermiyorsunuz?
Ether

@Ether, sadece varoluş operatörünü ve bulduğum ilk sayfasını aradığım için. PerlDoc geçmişe bakıldığında muhtemelen daha iyi bir seçenekti.
mdm

13

Kullanabilirsiniz: if(-e $base_path)


7
-fNormal bir dosyayı test etmek için de kullanabilirsiniz (bir dizin veya diğer çeşitli özel dosya türlerinin aksine)
tam

11

kullanın:

if (-f $filePath)
{
  # code
}

-edosya bir dizin olsa bile true değerini döndürür. -fyalnızca gerçek bir dosya ise doğru döndürür


5
#!/usr/bin/perl -w

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

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

hile yapardı


1

Aşağıdaki kodu kullanın. Burada -kontrol ederse, bir dosya veya değil:

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

ve keyfini çıkarın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.