Как я могу проверить, существует ли файл в Perl?

76

У меня есть относительный путь

   $base_path = "input/myMock.TGZ";

myMock.TGZ - это имя файла, находящегося во входной папке. Имя файла может измениться. Но путь всегда хранится в $base_path.

Мне нужно проверить, существует ли файл в $base_path.

Теги:

8 ответов

122
Лучший ответ

Проверьте, существует ли что-то на заданном пути с помощью оператора -e file-test.

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

Однако этот тест, вероятно, шире, чем вы предполагаете. Приведенный выше код будет генерировать вывод, если на этом пути существует простой файл, но он также будет запускаться для каталога, именованного канала, символической ссылки или более экзотической возможности. Подробнее см. в документации.

Учитывая расширение .TGZ в вашем вопросе, кажется, что вы ожидаете простой файл, а не альтернативы. Оператор file-test -f спрашивает, ведет ли путь к простому файлу.

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

Документация perlfunc охватывает длинный список Perl file-test операторов, который охватывает многие ситуации, с которыми вы столкнетесь на практике.

  • -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
    Файл является символической ссылкой (false, если symlinks arent поддерживается файловой системой).
  • -p
    Файл - это именованный канал (FIFO), или Filehandle - это канал.
  • -s
    Файл - это сокет.
  • -b
    Файл представляет собой специальный файл блока.
  • -c
    Файл является специальным файлом символа.
  • -t
    Файл дескриптора открывается в tty.
  • -u
    Файл имеет бит setuid.
  • -g
    Файл имеет бит setgid.
  • -k
    Файл имеет липкий бит.
  • -t
    Файл представляет собой текстовый файл ASCII или UTF-8 (эвристическое предположение).
  • -b
    Файл является "двоичным" файлом (напротив -t).
  • -M
    Script время начала минус время изменения файла, в днях.
  • -A
    То же самое для времени доступа.
  • -c
    То же самое для времени изменения inode (Unix, может отличаться для других платформ).
  • 0
    эй бекон, рад тебя видеть. так -е даже работает на относительный путь? я думал, что это работает только для определенного файла ... круто спасибо
  • 3
    @superstar Привет еще раз! Да, -e работает с относительными путями, но я думаю , что я , возможно, не понял ваш вопрос. У вас есть каталог с именем myMock.TGZ , и вы хотите знать, содержит ли этот каталог файл с конкретным именем? Помогите нам дать вам лучшие ответы, отредактировав свой вопрос, чтобы включить примеры!
30

Возможно, вам нужен вариант существования... 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
               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.
13
if (-e $base_path)
{ 
 # code
}

-e является оператором существования в Perl.

Вы можете проверить разрешения и другие атрибуты, используя код эту страницу.

  • 2
    Почему бы вместо ссылки на официальную документацию для этих операторов?
  • 0
    @Ether, просто потому, что я искал оператор существования и его первую страницу, которую я нашел. PerlDoc был, вероятно, лучшим вариантом в ретроспективе.
12

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

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

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

if (-f $filePath)
{
  # code
}

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

5
#!/usr/bin/perl -w

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

выполнит трюк

0

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

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

и наслаждайтесь

Ещё вопросы

Сообщество Overcoder
Наверх
Меню