perl编程共享(一): 写文件和查找最近更新文件
时间:2007-05-24 来源:ChangQingCao
前段时间在Windows下做一些程序调度,由于bat脚本功能不是十分强大(本人擅长Shell脚本编程,用Shell写过两个3000多行的程序,常想在Windows下完成Linux下常做的一些自动化操作,觉得力不从心。),可能主要是因为我对bat脚本不熟悉,还没掌握它的一些强大功能。在bat编程找不着北后,我转向perl,在安装了active perl后,主要参考了active perl的document和一些其它资料,完成了许多我要实现的操作。
我对perl的理解和应用都只有不到一个月的时间,却深深体会到perl的强大,体会到perl的灵活。我遇到问题经常从网上找资料,其中大部分是论坛或博客里别人的经验共享,我自己从未贡献过什么,在CU和CSDN上也很少发帖回帖。从《perl编程共享》几篇开始,我将陆续共享自己的一些编程经验。当然,这些可能对一些人来说没有任何参考价值,甚至程序中错漏不少,但我想多交流还是有利于彼此的提高。
下面的perl程序我是在windows下和Linux下都测试过可以正常运行的,注释也应该足够详细,暂时不作其他说明,如果有必要,以后再添加。 #!/bin/perl
use File::Path;
use File::stat qw(:FIELDS);
use POSIX qw(strftime);
use Cwd;
use File::Basename; my $FULL_NAME = $0; # 带路径的当前执行文件名
my $IMPORT_HOME = dirname("$FULL_NAME"); # 程序所在目录
chdir("$IMPORT_HOME");
$IMPORT_HOME = cwd; # 将程序所在目录以绝对路径形式表示
my $LOG; # 由create_log函数初始化,并在write_logs函数中使用
my $TODAY = strftime "%Y-%m-%d", localtime; ################################################################################
# 函数名: write_logs
# 函数描述: 写日志
# 输入: 参数一:log_file 日志文件
# 参数二:content 日志内容
# 输出: 无
# 调用:
# 被调用: get_latest_file
# 返回:
################################################################################
sub write_logs
{
local ($log_file, $content)=@_;
local $current_time = strftime "%Y-%m-%d %H:%M:%S", localtime;
open(LOGF, ">>$log_file") || warn "Can not open file: $!";
print LOGF "$current_time $content";
close(LOGF);
} ################################################################################
# 函数名: get_latest_file
# 函数描述: 根据文件最后修改时间取指定目录最近24小时修改过的文件列表
# 输入: 参数一:src_dir 文件所在目录
# 输出: 无
# 调用: write_logs
# 被调用:
# 返回: 最近24小时修改过的文件列表(必须用数组来存储返回值才能得到想要的结果)
################################################################################
sub get_latest_file
{
local ($src_dir) = @_;
local @all_files;
local @latest_files;
# 起始时间点为 00:00 January 1, 1970 GMT (stat函数返回值决定)
local $sec_since_1970 = 0; # 起始时间点到当前时间的秒数
local $last_modify = 0; # 起始时间点到文件最后修改时间的秒数
local $sec_to_now = 0; # 文件最后修改时间到当前时间的秒数
if (! -d $src_dir)
{
write_logs($LOG, "错误:目录$src_dir不存在!\n");
die "错误:目录$src_dir不存在!\n";
}
opendir(DIR, "$src_dir") || warn "Can open dir $src_dir: $!";
@all_files = grep(!/^\.\.?$/, readdir DIR);
chdir($src_dir);
# 创建临时文件,取其最后修改时间,即从起始时间点到当前时间秒数,后删除之
open(SIGN, ">sign.$$");
print SIGN "just a sign of importer.";
close(SIGN);
stat("sign.$$");
$sec_since_1970 = $st_mtime;
unlink("sign.$$");
for ($i = 0; $i < @all_files; $i++)
{
stat($all_files[$i]);
$last_modify = $st_mtime;
$sec_to_now = $sec_since_1970 - $last_modify;
if (-f $all_files[$i] && $sec_to_now <= 86400)
{
@latest_files = (@latest_files, $all_files[$i]);
}
}
closedir(DIR);
chdir($IMPORT_HOME);
return @latest_files;
}
下面的perl程序我是在windows下和Linux下都测试过可以正常运行的,注释也应该足够详细,暂时不作其他说明,如果有必要,以后再添加。 #!/bin/perl
use File::Path;
use File::stat qw(:FIELDS);
use POSIX qw(strftime);
use Cwd;
use File::Basename; my $FULL_NAME = $0; # 带路径的当前执行文件名
my $IMPORT_HOME = dirname("$FULL_NAME"); # 程序所在目录
chdir("$IMPORT_HOME");
$IMPORT_HOME = cwd; # 将程序所在目录以绝对路径形式表示
my $LOG; # 由create_log函数初始化,并在write_logs函数中使用
my $TODAY = strftime "%Y-%m-%d", localtime; ################################################################################
# 函数名: write_logs
# 函数描述: 写日志
# 输入: 参数一:log_file 日志文件
# 参数二:content 日志内容
# 输出: 无
# 调用:
# 被调用: get_latest_file
# 返回:
################################################################################
sub write_logs
{
local ($log_file, $content)=@_;
local $current_time = strftime "%Y-%m-%d %H:%M:%S", localtime;
open(LOGF, ">>$log_file") || warn "Can not open file: $!";
print LOGF "$current_time $content";
close(LOGF);
} ################################################################################
# 函数名: get_latest_file
# 函数描述: 根据文件最后修改时间取指定目录最近24小时修改过的文件列表
# 输入: 参数一:src_dir 文件所在目录
# 输出: 无
# 调用: write_logs
# 被调用:
# 返回: 最近24小时修改过的文件列表(必须用数组来存储返回值才能得到想要的结果)
################################################################################
sub get_latest_file
{
local ($src_dir) = @_;
local @all_files;
local @latest_files;
# 起始时间点为 00:00 January 1, 1970 GMT (stat函数返回值决定)
local $sec_since_1970 = 0; # 起始时间点到当前时间的秒数
local $last_modify = 0; # 起始时间点到文件最后修改时间的秒数
local $sec_to_now = 0; # 文件最后修改时间到当前时间的秒数
if (! -d $src_dir)
{
write_logs($LOG, "错误:目录$src_dir不存在!\n");
die "错误:目录$src_dir不存在!\n";
}
opendir(DIR, "$src_dir") || warn "Can open dir $src_dir: $!";
@all_files = grep(!/^\.\.?$/, readdir DIR);
chdir($src_dir);
# 创建临时文件,取其最后修改时间,即从起始时间点到当前时间秒数,后删除之
open(SIGN, ">sign.$$");
print SIGN "just a sign of importer.";
close(SIGN);
stat("sign.$$");
$sec_since_1970 = $st_mtime;
unlink("sign.$$");
for ($i = 0; $i < @all_files; $i++)
{
stat($all_files[$i]);
$last_modify = $st_mtime;
$sec_to_now = $sec_since_1970 - $last_modify;
if (-f $all_files[$i] && $sec_to_now <= 86400)
{
@latest_files = (@latest_files, $all_files[$i]);
}
}
closedir(DIR);
chdir($IMPORT_HOME);
return @latest_files;
}
相关阅读 更多 +