Получение DateModifed файла с помощью Stat() в Perl - Неправильная операция управления вводом / выводом

Я пытаюсь прочитать значение даты, измененное в файле, но мне не удалось это сделать. Я постоянно получаю сообщения об ошибках "Неправильная операция ввода-вывода". Это структура каталогов Windows, которую я пытаюсь прочитать. Я попытался передать полный путь к файлу вместе с именем файла ($outputFilePath."/".$ Files) в функцию stat() (в этом случае $! Ничего не возвращает, программа просто умирает). как использование дескриптора файла (ниже) без результатов. Любая помощь приветствуется.

chdir($outputFilePath);
opendir(my $dirHandle, $outputFilePath) or die "Cannot opendir $outputFilePath: $!";
my $files;
my $modTime; 
#print getcwd();
while($files = readdir($dirHandle)){
  if($files ne '.' && $files ne '..'){
    open(my $fileHandle, $files) or die "Cannot open $files: $!";
    $modTime = (stat($fileHandle))[9] or die "Cannot stat file $files: $!";
    print $files."-".$modTime."\n";
    close($fileHandle);
   }
}
closedir($dirHandle);

2 ответа

Решение

Возможно, следующее, которое использует оператор fileglob для получения списка файлов в каталоге, поможет вам:

use strict;
use warnings;
use File::stat;

my $outputFilePath = 'C:\Moodle\server\php';
chdir $outputFilePath;

print "$_-" . stat($_)->mtime . "\n" for <*>;

Частичный вывод:

cfg-1292006858
data-1324925198
DB-1324925198
debugclient-0.9.0.exe-1198234832
...
tmp-1292006858
www-1292006858
xdebug.txt-1198234860
zendOptimizer-1324925193

Последняя строка:

print "$_-" . stat($_)->mtime . "\n" for <*>;
        ^       ^         ^              ^^
        |       |         |              ||
        |       |         |              |+ - All files ( use <*.txt> to get only text files )
        |       |         |              + - glob angle-bracket operator generates list of file names in dir
        |       |         + - Get modification time
        |       + - Stat on file
        + - File name

Надеюсь это поможет!

readdir создает список имен файлов в каталоге, который он читает, т.е. без какой-либо информации о пути.

Так что вам нужно открыть "$outputFilePath/$files" вместо $files,

Обратите внимание, что stat работает с именами файлов, а также (или даже лучше) с файловыми дескрипторами. Так что вы можете просто позвонить stat на имя файла и избавьте себя от необходимости открывать и закрывать файловый дескриптор.

Другие вопросы по тегам