如果日志文件不存在,请在Perl中创建一个目录

时间:2012-08-21 08:59:00

标签: perl directory mkdir

我有一个带有一些参数的Perl脚本。它执行如下:

exec myscript.pl --file=/path/to/input/file --logfile=/path/to/logfile/logfile.log

我在脚本中有以下行:

open LOGFILE, ">>$logFilePath" or die "Can't open '$logFilePath': $!\n";

从命令行中取$logfilePath的位置。 如果有一个路径,/ path /到/ logfile /,但没有logfile.log,它只是创建它(这是所需的操作)。但是,如果没有这样的路径,它就无法启动。如果脚本在运行脚本之前不存在,如何创建日志文件的路径?

2 个答案:

答案 0 :(得分:22)

假设您在变量logfile.log中有日志文件的路径(可能包含或不包含文件名:$full_path)。然后,您可以根据需要创建相应的目录树:

use File::Basename qw( fileparse );
use File::Path qw( make_path );
use File::Spec;

my ( $logfile, $directories ) = fileparse $full_path;
if ( !$logfile ) {
    $logfile = 'logfile.log';
    $full_path = File::Spec->catfile( $full_path, $logfile );
}

if ( !-d $directories ) {
    make_path $directories or die "Failed to create path: $directories";
}

现在,$full_path将包含logfile.log文件的完整路径。路径中的目录树也已创建。

答案 1 :(得分:7)

更新:正如Dave Cross指出的那样,mkdir只创建一个目录。因此,如果您想一次创建多个级别,这将无效。

使用Perl的mkdir命令。例如:

#Get the path portion only, without the filename.
if ($logFilePath =~ /^(.*)\/[^\/]+\.log$/)
{
    mkdir $1 or die "Error creating directory: $1";
}
else
{
    die "Invalid path name: $logFilePath";
}

使用perl自己的函数比运行unix命令更好。

编辑:当然,您还应该先检查目录是否存在。使用-e检查是否存在某些内容。将其添加到上面的代码中:

#Get the path portion only, without the filename.
if ($logFilePath =~ /^(.*)\/[^\/]+\.log$/)
{
    if (-e $1) 
    {
        print "Directory exists.\n";
    }
    else
    {
        mkdir $1 or die "Error creating directory: $1";
    }
}
else
{
    die "Invalid path name: $logFilePath";
}