Как я могу проверить, существует ли файл в Perl? - PullRequest
103 голосов
/ 08 апреля 2010

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

   $base_path = "input/myMock.TGZ";

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

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

Ответы [ 8 ]

164 голосов
/ 08 апреля 2010

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

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
    Файл является символической ссылкой (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, может отличаться для других платформ)
29 голосов
/ 08 апреля 2010

Возможно, вы захотите вариант существования ... 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.
14 голосов
/ 08 апреля 2010
if (-e $base_path)
{ 
 # code
}

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

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

13 голосов
/ 08 апреля 2010

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

10 голосов
/ 06 мая 2014

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

if (-f $filePath)
{
  # code
}

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

5 голосов
/ 21 июня 2016
if(-e $base_path){print "Something";}

сделает трюк

5 голосов
/ 19 ноября 2014
#!/usr/bin/perl -w

$fileToLocate = '/whatever/path/for/file/you/are/searching/MyFile.txt';
if (-e $fileToLocate) {
    print "File is present";
}
1 голос
/ 28 июня 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...