Как я могу проверить, существует ли файл в 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
    Файл принадлежит действующему идентификатору пользователя.
  • -R
    Файл доступен для чтения настоящим uid / gid.
  • -W
    Файл доступен для записи настоящим uid / gid.
  • -X
    Файл исполняется настоящим uid / gid.
  • -O
    Файл принадлежит настоящему uid.
  • -e
    Файл существует.
  • -z
    Файл имеет нулевой размер (пуст).
  • -s
    Файл имеет ненулевой размер (возвращает размер в байтах).
  • -f
    Файл - это простой файл.
  • -d
    Файл - это каталог.
  • -l
    Файл - это символическая ссылка (false, если символические ссылки не поддерживаются файловой системой).
  • -p
    Файл - это именованный канал (FIFO), или Filehandle - это канал.
  • -S
    Файл - это сокет.
  • -b
    Файл - это специальный блочный файл.
  • -c
    Файл - это специальный символьный файл.
  • -t
    Дескриптор файла открыт для tty.
  • -u
    В файле установлен бит setuid.
  • -g
    В файле установлен бит setgid.
  • -k
    У файла установлен липкий бит.
  • -T
    Файл представляет собой текстовый файл в формате ASCII или UTF-8 (эвристическое предположение).
  • -B
    Файл - это «двоичный» файл (противоположный -T).
  • -M
    Время запуска скрипта за вычетом времени модификации файла, в днях.
  • -A
    То же самое для времени доступа.
  • -C
    То же самое для времени изменения inode (Unix, может отличаться для других платформ)

эй, бекон, рад тебя видеть. так -е даже работает для относительного пути? я думал, что это работает только для конкретного файла ... круто, спасибо
superstar

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

29

Возможно, вам понадобится вариант exists ... 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

@Ether, просто потому, что я искал оператор существования и это первая страница, которую я нашел. В ретроспективе PerlDoc, вероятно, был лучшим вариантом.
mdm 08

13

Ты можешь использовать: if(-e $base_path)


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

11

Использование:

if (-f $filePath)
{
  # code
}

-eвозвращает истину, даже если файл является каталогом. -fвернет только истину, если это настоящий файл



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

сделает трюк


1

Используйте приведенный ниже код. Здесь -f проверяет, файл это или нет:

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

и наслаждаться

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.