Як я можу перевірити, чи існує файл у Perl?


112

У мене відносний шлях

   $base_path = "input/myMock.TGZ";

myMock.TGZце ім'я файлу, що знаходиться у папці введення. Ім'я файлу може змінюватися. Але шлях завжди зберігається в $base_path.

Мені потрібно перевірити, чи існує файл у $base_path.

Відповіді:


179

Перевірте, чи існує щось на заданому шляху за допомогою -eоператора тестування файлів.

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

Однак цей тест, ймовірно, ширший, ніж ви маєте намір. Код, що наведено вище, генерує вихід, якщо на цьому шляху існує звичайний файл, але він також запустить для каталогу, іменованої труби, символьної посилання або більш екзотичної можливості. Детальну інформацію див. У документації .

З огляду на розширення .TGZвашого запитання, схоже, ви очікуєте простого файлу, а не альтернативи. Оператор -fтестування файлів запитує, чи веде шлях до простого файлу.

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

Документація perlfunc охоплює довгий список операторів тестування файлів Perl, який охоплює багато ситуацій, з якими ви зіткнетесь на практиці.

  • -r
    Файл читається за допомогою ефективного uid / gid.
  • -w
    Файл можна записати за допомогою ефективного uid / gid.
  • -x
    Файл виконується за допомогою ефективного uid / gid.
  • -o
    Файлом належить ефективний uid.
  • -R
    Файл читається справжнім uid / gid.
  • -W
    Файл можна записати справжнім uid / gid.
  • -X
    Файл виконується справжнім uid / gid.
  • -O
    Файл належить справжньому uid.
  • -e
    Файл існує.
  • -z
    Файл має нульовий розмір (порожній).
  • -s
    Файл має ненульовий розмір (повертає розмір у байтах).
  • -f
    Файл - це звичайний файл.
  • -d
    Файл - це каталог.
  • -l
    Файл - це символьне посилання (помилкове, якщо символьні посилання не підтримуються файловою системою).
  • -p
    Файл - це названа труба (FIFO), або Filehandle - це труба.
  • -S
    Файл - це сокет.
  • -b
    Файл - це спеціальний файл блоку.
  • -c
    Файл - це спеціальний файл символів.
  • -t
    Filehandle відкривається до tty.
  • -u
    У файлі встановлено встановлений біт.
  • -g
    Для файлу встановлено жорсткий біт.
  • -k
    У файлі встановлено клейкий біт.
  • -T
    Файл - це текстовий файл ASCII або UTF-8 (евристична здогадка).
  • -B
    Файл - це "двійковий" файл (навпроти -T).
  • -M
    Час початку сценарію мінус час зміни файлу, в днях.
  • -A
    Те саме для часу доступу.
  • -C
    Те саме для часу зміни inode (Unix, може відрізнятися для інших платформ)

ей бекон, приємно бачити тебе. так -е навіть працює для відносного шляху? Я думав, що це працює лише для конкретного файлу ... прикольне спасибі
суперзірка

3
@superstar Привіт ще раз! Так, -eпрацює з відносними шляхами, але я думаю, що я, можливо, неправильно зрозумів ваше запитання. Чи є у вас каталог з іменем myMock.TGZ, і ви хочете дізнатися, чи містить цей каталог файл із певним іменем? Допоможіть нам дати кращі відповіді, відредагувавши своє запитання, щоб включити приклади!
Грег Бекон

29

Можливо, ви хочете, щоб варіант існував ... 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.

Ви можете перевірити дозволи та інші атрибути, використовуючи код на цій сторінці .


3
Чому замість цього не посилання на офіційну документацію для цих операторів?
Ефір

@Ether, тільки тому, що я шукав оператора існування та його першу сторінку, яку я знайшов. PerlDoc був, мабуть, кращим варіантом у ретроспективі.
mdm

13

Ви можете використовувати: if(-e $base_path)


7
Ви також можете використати -fдля перевірки нормального файлу (на відміну від каталогу або різних інших спеціальних типів файлів)
justintime

11

Використання:

if (-f $filePath)
{
  # code
}

-eповертає true, навіть якщо файл є каталогом. -fповерне true, лише якщо це фактичний файл



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

зробив би трюк


1

Використовуйте наведений нижче код. Ось -ко перевіряє, це файл чи ні:

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

і насолоджуватися

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.