Проблема с оператором проверки файлов в Perl - PullRequest
0 голосов
/ 01 февраля 2011

Я отлаживаю фрагмент кода, который использует функцию Perl '-s' , чтобы получить размер некоторых файлов.

my $File1 = /myfolder/.../mysubfolder1/document.pdf
my $File2 = /myfolder/.../mysubfolder2/document.pdf
my $File3 = /myfolder/.../mysubfolder1/document2.pdf ($File3 на самом деле ссылка на /myfolder/.../mysubfolder2/document.pdf aka $File2)

Код с ошибкой:

my $size = int((-s $File)/1024);

Где $File заменяется на $File1 - $File3.

. По некоторым причинам я не могу объяснить, что это работает не для каждого файла.

Для $File1 и $File3 это работает, но не для $File2.Я мог бы понять, что если $File2 и $File3 не будут работать, это будет означать, что файл /myfolder/.../mysubfolder2/document.pdf как-то поврежден.Я даже добавил тест if (-e $File)|{ перед -s, чтобы убедиться, что файл существует, но три файла существуют.

Существует еще более странная вещь: в * 1038 есть .htaccess* но не .htaccess в /myfolder/.../mysubfolder2/.Если бы оно было обратным, я бы подумал, что .htaccess как-то заблокирует вызов -s.

Есть мысли?

Ответы [ 4 ]

10 голосов
/ 01 февраля 2011

Если -s не удается, он возвращает undef и устанавливает ошибку в $ !. Что такое $!?

5 голосов
/ 01 февраля 2011

Чтобы указать конец вашего комментария, .htaccess файл контролирует доступ к файлам по запросу веб-сервера .Как только пользователь запрашивает URL-адрес, который выполняет допустимый допустимый CGI / любой другой сценарий (я предполагаю, что ваш код Perl находится в веб-контексте), сценарий THAT не имеет абсолютно никаких проблем с разрешением в отношении .htaccess (если вы на самом деле не пишете свой Perl для чтения его содержимогои строго соблюдайте их вручную).

Единственное разрешение, которое может испортить ваш Perl-файл, - это разрешения файловой системы в вашей ОС.

Чтобы получить размер файла, вашему веб-пользователю необходимо:

  • Разрешение на выполнение для каталога, содержащего файл

  • Возможно, разрешение на чтение для каталога, содержащего файл (не уверен, если размер файлахранится в inode?)

  • Возможно, разрешение на чтение самого файла.

Если все ваши 3 файла (2 хороших и 1 плохой)) находятся в одном и том же каталоге, проверьте разрешения на чтение файла.

Если они находятся в разных каталогах, проверьте права доступа на чтение файла И ИЛИ каталоги.

5 голосов
/ 01 февраля 2011

Я полагаю, что если вы проверите размер этого файла с помощью "stat", вы получите что-то меньше, чем 1024 байта :) ваш int ((- s $ fn) / 1024) вернет 0, если размер меньше 1024

4 голосов
/ 01 февраля 2011

Измените int((-s $file)/1024) на sprintf('%.0f', (-s $file)/1024) - тогда вы увидите что-то, размер файла, вероятно, меньше 1024 байт, поэтому int() с радостью вернет 0.

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