Почему я не могу открыть файлы, возвращенные Perl readdir? - PullRequest
1 голос
/ 13 октября 2009

Что ж, я знаю, что это еще один вопрос новичка, но я очень расстроен и надеюсь снова стать просветленным. Под руководством вас, ребята, я уже научился использовать функцию glob для чтения содержимого каждого файла в каталоге. Сейчас я пытаюсь использовать комбинацию readdir-foreach, чтобы сделать то же самое, но получаю сообщение об ошибке «Не удается открыть файл: доступ запрещен». Почему это происходит с тем же каталогом, теми же файлами и мной, что и администратор. Может кто-то любезно показать мне, что я делаю не так? Спасибо.

Следующий код использует функцию glob и работает:

#! perl
my $dir = 'f:/corpus/';
my @files = glob "$dir/*";
foreach my $file (@files) {
open   my $data, '<',"$file" or die "Cannot open FILE";
while(<$data>) {
...}

Следующий код завершается ошибкой, и в сообщении об ошибке говорится: «Не удается открыть файл: разрешение запрещено». Но почему?

#! perl
my $dir = 'f:/corpus/';
opendir (DIR,'f:/corpus/') or die "Cannot open directory:$!";
my @files=readdir(DIR);
closedir DIR;
foreach my $file (@files) {
open   my $data, '<',"$file" or die "Cannot open FILE:$!";
while(<$data>) {
...}

Ответы [ 2 ]

8 голосов
/ 13 октября 2009

Функция readdir() возвращает только имя файла, а не полный путь. Таким образом, вы пытаетесь открыть, например, "foo.txt" вместо "f: \ corpus \ foo.txt".

4 голосов
/ 13 октября 2009

Следует иметь в виду, что readdir возвращает имена каталогов и имена файлов. Скорее всего, вы пытаетесь открыть одну из специальных записей каталога . или .., которые обычно нужно отфильтровать, если вы используете следующие функции:

foreach my $f (@files)
{
    # skip special directory entries
    if ($f ne '.' && $f ne '..')
    {
        # ...
        print "$f\n";
    }
}

Также обратите внимание Энди Росс 'на мысль, что это вернет только относительный путь, а не полный путь.

...