| 
 
     
- UID
 - 1 
 - 威望
 - 1240 点 
 - 金钱
 - 24019 金币 
 - 点卡
 - 317 点 
 
  | 
1#
 
发表于 2004-1-10 11:23
 |  只看该作者
 
 
 
 [转帖]制作了几个通用文件读写函数,供参考
摘自 中国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");   
 
文件读写代码是不是变得很简单了? |   
 
 
 
 
                     我是一个呼吸着现在的空气而生活在过去的人 
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠 
                                     我已习惯了孤独,爱上孤独 
                                 他让我看清了自我,还原了自我 
                             让我再静静的沉思中得到快乐和满足 
                                   再孤独的世界里我一遍又一遍 
                                   不厌其烦的改写着自己的过去 
                                             延伸到现在与未来 
                                       然而那只是泡沫般的美梦 
                                 产生的时刻又伴随着破灭的到来 
                         在灰飞烟灭的瞬间我看到的是过程的美丽 
                                      而不是结果的悲哀。。。 
 | 
 
 
 
 |