2010-04-08 3 views
79

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

$base_path = "input/myMock.TGZ"; 

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

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

ответ

128

Проверить, есть ли что-то существует на заданном пути, используя оператор проверки файлов -e.

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

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

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

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

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

  • -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) или ссылка на файл трубы.
  • -S
    Файл - это сокет.
  • -b
    Файл является специальным блоком.
  • -c
    Файл является специальным символом.
  • -t
    Filehandle открыт для tty.
  • -u
    Файл имеет установочный бит.
  • -g
    Файл имеет установленный бит бит.
  • -k
    В файле установлен липкий бит.
  • -T
    файла является ASCII или UTF-8 текстовый файл (эвристический догадка).
  • -B
    Файл является «двоичный» файл (напротив -T).
  • -M
    Время начала скрипта минус время модификации файла, в днях.
  • -A
    То же самое касается времени доступа.
  • -C
    То же самое для изменения времени инода (Unix, могут отличаться для других платформ)
+0

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

+3

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

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

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

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

+2

Почему бы не ссылки на официальную документацию для этих операторов вместо? – Ether

+0

@ Просто, потому что я искал оператора существования и его первую страницу, которую я нашел. PerlDoc, вероятно, был лучшим вариантом в ретроспективе. – mdm

12

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

+7

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

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

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

if (-f $filePath) 
{ 
    # code 
} 

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

5
#!/usr/bin/perl -w 

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

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

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

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

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

будет делать трюк

Смежные вопросы