返回列表 回复 发帖

[转帖]制作了几个通用文件读写函数,供参考

摘自 中国CCB网站 http://www.sun126.com 麻辣  2003-11-10 14:47
文本数据的读写安全性和可靠性是个很重要的问题。有时候数据莫名其妙的丢失。我以前用perl内部的flock函数,但始终没掌握好它的用法,这个函数在各种环境下表现也不同,我实在没有条件配备不同的操作系统来测试,研究了很长时间也掌握不好它的规律。

所以我改变了决定,自己做文件锁,所有读写一律上锁,达到这样效果,除非遇到操作系统死机而碰巧有人写文件写到半截,应该不会出现问题。

当然,我是这么想的,是不是有漏洞还需要大家多参谋和指点。

文本文件读写通用函数:

1 绝对禁止同时读写同名文件,如碰巧,那就排队等候。
2 程序中所有读写一律用以下几个函数统一控制,其他代码中就再也不会出现重复的“open”字样.简化我的代码,便于维护和升级。

#///---------------------------------------------------------------------///#
# 函数名字      :   filelock                                                #
# 所需元素      :   文件路径                                                #
# 用    途      :   锁住文本文件                                            #
#///---------------------------------------------------------------------///#
sub filelock {
while (-e "$_[0].lock") {$i++;
    select(undef,undef,undef,0.1);
    if ($i >10){print"服务器忙,稍候...$_[0].lock";exit;}
    }
}
#///---------------------------------------------------------------------///#
# 函数名字      :   readfile                                                #
# 所需元素      :   文件路径                                                #
# 返回结果      :   变量形式文件内容                                        #
# 用    途      :   读取文本文件第一行                                      #
#///---------------------------------------------------------------------///#
sub readfile {
   &filelock($_[0]);
   open (FILE,"$_[0]");   
   my $readfile = <FILE>;
  close(FILE);
return ($readfile);
}
#///---------------------------------------------------------------------///#
# 函数名字      :   readfile_n                                              #
# 所需元素      :   文件路径                                                #
# 返回结果      :   变量形式文件内容                                        #
# 用    途      :   读取整个文本文件                                        #
#///---------------------------------------------------------------------///#
sub readfile_n {
   &filelock($_[0]);
   $/="";
   open (FILE,"$_[0]");   
   my $readfile = <FILE>;
  close(FILE);
  $/="\n";
return ($readfile);
}
#///---------------------------------------------------------------------///#
# 函数名字      :   a_readfile                                              #
# 所需元素      :   文件路径                                                #
# 返回结果      :   数组形式文件内容                                        #
# 用    途      :   把读取文本文件变量转换为数组                            #
#///---------------------------------------------------------------------///#
sub a_readfile {
   my $readfile = &readfile_n($_[0]);;
   my @a_readfile= split( /\n/, $readfile );
return (@a_readfile);
}
#///---------------------------------------------------------------------///#
# 函数名字      :   writefile                                               #
# 所需元素      :   $[0]文件路径,$[1]需要写入的内容                         #
# 返回结果      :   1                                                       #
# 用    途      :   文件写入函数                                            #
#///---------------------------------------------------------------------///#
sub writefile {
    &filelock($_[0]);
    open( FILE, ">$_[0].lock" );
    close(FILE);
    open( FILE, ">$_[0]" );
    print FILE "$_[1]";
    close(FILE);
    chmod( 0666, "$_[0]" );
    unlink("$_[0].lock");
}
#///---------------------------------------------------------------------///#
# 函数名字      :   writefile                                               #
# 所需元素      :   $[0]文件路径,$[1]需要写入的内容                         #
# 返回结果      :   1                                                       #
# 用    途      :   文件追加写入函数                                        #
#///---------------------------------------------------------------------///#
sub writefile_a {
    &filelock($_[0]);
    open( FILE, ">$_[0].lock" );
    close(FILE);
    open( FILE, ">>$_[0]");
    print FILE "$_[1]";
    close(FILE);
    unlink("$_[0].lock");
}
#///---------------------------------------------------------------------///#
# 函数名字      :   writefile                                               #
# 所需元素      :   $[0]文件路径                                            #
# 返回结果      :   数组                                                    #
# 用    途      :   读取目录下所有文件                                      #
#///---------------------------------------------------------------------///#
sub a_readdir {
    opendir( FILESS, "$_[0]" );
    @lines = readdir(FILESS);
    closedir(FILESS);
return (@lines);
}
#///---------------------------------------------------------------------///#
# 函数名字      :   readfile_s                                              #
# 所需元素      :   $[0]文件路径,读取的字节数                               #
# 返回结果      :   变量                                                    #
# 用    途      :   读取文件系统级                                          #
#///---------------------------------------------------------------------///#
sub readfile_s {
        &filelock($_[0]);
        sysopen FILES, "$_[0]", O_RDONLY;
        sysread( FILES, my $readfile_s, $_[1] );
        close(FILES);
return ($readfile_s);
}
#///---------------------------------------------------------------------///#
# 函数名字      :   readfile_s_e                                            #
# 所需元素      :   $[0]文件路径,读取的字节数,末尾移动字节数                #
# 返回结果      :   变量                                                    #
# 用    途      :   读取文件 系统级                                         #
#///---------------------------------------------------------------------///#
sub readfile_s_e {
        &filelock($_[0]);
        sysopen FILES, "$_[0]", O_RDONLY;
        sysseek FILES, -$_[2], 2;
        sysread( FILES, $readfile_s_e, $_[1] );
        close(FILES);
return ($readfile_s_e);
}


######################### END

示例,更新计数器  

my $readfile=&readfile("$_data_path/data/v_member.txt");  
$readfile++;  
&writefile("$_data_path/data/v_member.txt","$readfile");  

文件读写代码是不是变得很简单了?

                     我是一个呼吸着现在的空气而生活在过去的人
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
                                     我已习惯了孤独,爱上孤独
                                 他让我看清了自我,还原了自我
                             让我再静静的沉思中得到快乐和满足
                                   再孤独的世界里我一遍又一遍
                                   不厌其烦的改写着自己的过去
                                             延伸到现在与未来
                                       然而那只是泡沫般的美梦
                                 产生的时刻又伴随着破灭的到来
                         在灰飞烟灭的瞬间我看到的是过程的美丽
                                      而不是结果的悲哀。。。
返回列表