![Rank: 9](images/default/star_level3.gif) ![Rank: 9](images/default/star_level3.gif) ![Rank: 9](images/default/star_level1.gif)
- UID
- 1
- 威望
- 1240 点
- 金钱
- 10002 金币
- 点卡
- 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");
文件读写代码是不是变得很简单了? |
我是一个呼吸着现在的空气而生活在过去的人
这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
我已习惯了孤独,爱上孤独
他让我看清了自我,还原了自我
让我再静静的沉思中得到快乐和满足
再孤独的世界里我一遍又一遍
不厌其烦的改写着自己的过去
延伸到现在与未来
然而那只是泡沫般的美梦
产生的时刻又伴随着破灭的到来
在灰飞烟灭的瞬间我看到的是过程的美丽
而不是结果的悲哀。。。
|
|