[問題] 檔案會變成empty@@"
我的網站有一個很久以前寫的下載管理程式,平時運作還正常
但是就是有一點很奇怪,隔一段時間,下載的資料檔會突然變成empty
也就是0位元組,裡面什麼都沒有
我想是因為下載人數會去更動到檔案的部份,如果有兩個人同時下載檔案
可能會造成檔案損壞之類的情況,但這只是個人推測
而奇怪的是我看我原始檔裡面有lock檔阿,可是不知為何
隔一段時間資料檔就會突然清空
以下是該Perl程式的檔案,新增人數的函數是addtime
誰可不可以幫我看一下,是我鎖檔案沒弄好所造成的錯誤,還是什麼樣的情況
會造成檔案內容清空?
#!/usr/bin/perl
## ~---------------------
## ~ 取得資料
## ~---------------------
sub getdata{
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $in, $ENV{'CONTENT_LENGTH'});
}else{
$in = $ENV{'QUERY_STRING'};
}
@pairs = split(/&/,$in);
foreach $pair(@pairs) {
($name,$value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #解碼
$value =~ s/\,/,/g; #取代,號
$value =~ s/\r\n/<br>/g; #取代斷行
if ($FORM{$name} ne ''){
$FORM{$name} = "$FORM{$name},$value"; #給予FORM
}else{
$FORM{$name} = $value;
}
}
}
## ~---------------------
## ~ 係統設定
## ~---------------------
$perl_url = 'download.pl'; ## 程式位置
$data_url = 'download/data.cgi'; ## 資料庫位置
$sn_url = 'download/sn.txt'; ## 流水號檔
$id = '********'; ## 管理帳號
$pass = '*******'; ## 管理密碼
$s_url{'out'} = 'download_out.htm' ; ## 外部樣版
$s_url{'table'} = 'download/table.htm' ; ## 表格樣版
$s_url{'adm_m'} = 'download/adm_menu.htm' ; ## 管理員選單樣版
$s_url{'adm_t'} = 'download/adm_table.htm' ; ## 管理員表格樣版
$s_url{'login'} = 'download/login.htm' ; ## 管理員登入樣版
$s_key{'in'} = '!~in~!'; ## 外部樣版置入
$s_key{'name'} = '!~name~!'; ## 名稱
$s_key{'text'} = '!~text~!'; ## 簡介
$s_key{'d_url'} = '!~d_url~!'; ## 載點
$s_key{'c_time'} = '!~c_time~!'; ## 次數
$s_key{'size'} = '!~size~!'; ## 大小
$s_key{'pic'} = '!~pic~!'; ## 圖片位置
$s_key{'url'} = '!~url~!'; ## 程式位置
$s_key{'sn'} = '!~sn~!'; ## 檔案編號
## ~---------------------
## ~ 主要程式
## ~---------------------
&getdata; ## 取得資料
&getcookie; ## 取得Cookie
&setadmcookie; ## 設定ADMCookie
&loadskins; ## 載入樣版
if ($FORM{mode} eq 'new' && &c_idps == 1){
&newfile;
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif($FORM{mode} eq 'download'){
&addtime($FORM{sn});
print "Location: $FORM{url}\n\n"; ## 跳到檔案
exit;
}elsif($FORM{mode} eq 'login'){
print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭
$skin_get{login}=~ s/$s_key{url}/$perl_url/g;
$skin_get{out} =~ s/$s_key{in}/$skin_get{login}/g;
print "$skin_get{out}";
exit;
}elsif($FORM{'mode'} eq 'out' && &c_idps == 1){
$date_gmt = "1987, 1\-1\-1 1:1:1 GMT";
print "Set-Cookie:id=0; expires=$date_gmt\n";
print "Set-Cookie:pass=0; expires=$date_gmt\n";
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif($FORM{mode} eq 'fix' && &c_idps == 1){
&fixfile($FORM{sn});
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif($FORM{mode} eq 'top' && &c_idps == 1){
&topfile($FORM{sn});
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif($FORM{mode} eq 'del' && &c_idps == 1){
&delfile($FORM{sn});
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}elsif(&c_idps == 1){
&shelladmhtml;
print "Location: $perl_url\n\n"; ## 跳回原頁
exit;
}
&shellhtml;
exit;
## ~---------------------
## ~ 輸出網頁
## ~---------------------
sub shellhtml{
print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭
if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");}
@gd=<GD>;
close(GD);
foreach $gad(@gd){
($GD{'name'},$GD{'text'},$GD{'d_url'},$GD{'pic'},$GD{'size'},$GD{'c_time'},$GD{'sn'})=
split(/,/,$gad) ;
chomp($GD{'sn'});
$gethtml = $skin_get{table};
foreach $keyi(keys %s_key){
$gethtml =~ s/$s_key{$keyi}/$GD{$keyi}/g;
}
$htmlshell .= $gethtml;
}
if ($htmlshell eq ''){
$htmlshell='<br><div align="center"></div><table width="500"
border="0" align="left"><tr><td><div align="center">沒有檔案
</div></td></tr></table><br>';
}
$htmlshell .= "<div align=\"left\"><br><a href=\"$perl_url?mode=login\">管
理作品下載</a></div>";
$skin_get{out} =~ s/$s_key{in}/$htmlshell/g;
print "$skin_get{out}";
}
## ~---------------------
## ~ 輸出管理員用網頁
## ~---------------------
sub shelladmhtml{
print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭
if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");}
@gd=<GD>;
close(GD);
$GD{'url'} =$perl_url;
$htmlshell = $skin_get{'adm_m'};
$htmlshell =~ s/$s_key{url}/$perl_url/g;
foreach $gad(@gd){
($GD{'name'},$GD{'text'},$GD{'d_url'},$GD{'pic'},$GD{'size'},$GD{'c_time'},$GD{'sn'})=
split(/,/,$gad) ;
chomp($GD{'sn'});
$gethtml = $skin_get{adm_t};
foreach $keyi(keys %s_key){
$gethtml =~ s/$s_key{$keyi}/$GD{$keyi}/g;
}
$htmlshell .= $gethtml;
}
if ($htmlshell eq ''){
$htmlshell='<br><div align="center"></div><table width="500"
border="0" align="left"><tr><td><div align="center">沒有檔案
</div></td></tr></table><br>';
}
$htmlshell .= "<div align=\"left\"><br><a href=\"$perl_url?mode=login\">管
理作品下載</a></div>";
$skin_get{out} =~ s/$s_key{in}/$htmlshell/g;
print "$skin_get{out}";
}
## ~---------------------
## ~ 新增下載資料
## ~---------------------
sub newfile{
if ( !( open(GD,"<$data_url") ) ){&error("$data_url 無法讀檔");}
@gd=<GD>;
close(GD);
&getsn;
$name = $FORM{'name'};
$text = $FORM{'text'};
$d_url = $FORM{'d_url'};
$pic = $FORM{'pic'};
$size = $FORM{'size'};
$wd = "$name,$text,$d_url,$pic,$size,0,$sn\n";
unshift(@gd,$wd);
## 對檔尾的斷行去除
$last=pop(@gd); #取出
chomp($last);
push(@gd,$last); #放回
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
&addsn;
}
## ~---------------------
## ~ 刪除檔案
## ~---------------------
sub delfile{
## 取得記錄檔
if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");}
@gd=<GD>;
close(GD);
$delsn=$_[0];
foreach $gad(@gd){
($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ;
chomp($sn);
if ($delsn == $sn){
$gad='';
}
}
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
}
## ~---------------------
## ~ 檔案置頂
## ~---------------------
sub topfile{
## 取得記錄檔
if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");}
@gd=<GD>;
close(GD);
$topsn=$_[0];
foreach $gad(@gd){
($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ;
chomp($sn);
if ($topsn == $sn){
splice(@gd,$i,1);
unshift(@gd,"$name,$text,$d_url,$pic,$size,$c_time,$sn\n");
}
$i++;
}
## 對檔尾的斷行去除
$last=pop(@gd); #取出
chomp($last);
push(@gd,$last); #放回
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
}
## ~---------------------
## ~ 增加次數
## ~---------------------
sub addtime{
## 取得記錄檔
if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");}
@gd=<GD>;
close(GD);
$addsn=$_[0];
foreach $gad(@gd){
($name,$text,$d_url,$pic,$size,$c_time,$sn)= split(/,/,$gad) ;
chomp($sn);
if ($addsn == $sn){
$c_time++;
$gad= "$name,$text,$d_url,$pic,$size,$c_time,$sn\n";
}
}
## 對檔尾的斷行去除
$last=pop(@gd); #取出
chomp($last);
push(@gd,$last); #放回
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
}
## ~---------------------
## ~ 修改檔案
## ~---------------------
sub fixfile{
## 取得記錄檔
if ( !( open(GD,"<$data_url") ) ){&error("$data_url無法讀檔");}
@gd=<GD>;
close(GD);
$fixsn=$_[0];
$name = $FORM{'name'};
$text = $FORM{'text'};
$d_url = $FORM{'d_url'};
$pic = $FORM{'pic'};
$size = $FORM{'size'};
$c_time= $FORM{'c_time'};
foreach $gad(@gd){
($temp,$temp,$temp,$temp,$temp,$temp,$sn)= split(/,/,$gad) ;
chomp($sn);
if ($fixsn == $sn){
$gad= "$name,$text,$d_url,$pic,$size,$c_time,$sn\n";
}
}
## 對檔尾的斷行去除
$last=pop(@gd); #取出
chomp($last);
push(@gd,$last); #放回
## 存回記錄檔
if ( !( open(SD,">$data_url") ) ){&error("$data_url無法存檔");}
flock(2,SD); #鎖檔
print SD @gd;
flock(8,SD); #開鎖
close(SD);
}
## ~---------------------
## ~ 設定ADM的Cookie
## ~---------------------
sub setadmcookie{
if ($FORM{id} ne '' && $FORM{pass} ne ''){
print "Set-Cookie:id=$FORM{id};\n";
print "Set-Cookie:pass=$FORM{pass};\n";
$COOKIE{id}=$FORM{id};
$COOKIE{pass}=$FORM{pass};
}
}
## ~---------------------
## ~ 得到Cookie
## ~---------------------
sub getcookie{
$cookies = $ENV{'HTTP_COOKIE'};
@pairs = split(/;/,$cookies); ##取得不同組的cookie
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ s/ //g;
$COOKIE{$name} = $value;
}
if ($FORM{'pass'} ne ''){ $COOKIE{'pass'}=$FORM{'pass'};}
if ($FORM{'id'} ne ''){ $COOKIE{'id'}=$FORM{'id'};}
}
## ~---------------------
## ~ 得到頁數資料
## ~---------------------
sub get_page{
$FORM{page}-=1;
if ($book_m <= $page_ch){ ## 篇數沒有超過指定的換頁數
$book_s=0;
$book_e=$book_m-1;
}else{
if ($book_m % $page_ch==0){
$page_m=$book_m / $page_ch;
}else{
$page_m=int($book_m / $page_ch)+1;
}
if ($FORM{page}+1>=$page_m){ ## 最後一頁 或超過
$FORM{page}=$page_m-1;
$book_s=$FORM{page} * $page_ch;
$book_e=$book_m -1 ;
}else{
if ($FORM{page} < 0){
$FORM{page}=0;
}
$book_s=$FORM{page} * $page_ch;
$book_e=(($FORM{page}+1) * $page_ch)-1;
}
}
if ($page_m eq ''){
$page_m=0;
}
}
## ~---------------------
## ~ 載入所有樣版
## ~---------------------
sub loadskins{
foreach $skinkey(keys %s_url) {
&loadskin($s_url{$skinkey},$skinkey)
}
}
## ~---------------------
## ~ 載入樣版
## ~---------------------
sub loadskin{
if ( !( open(SKIN,"<$_[0]") ) ){&error("$_[0] 樣版 無法讀取");}
@gskin=<SKIN>;
close(SKIN);
foreach $line(@gskin){
$skin_get{$_[1]}="$skin_get{$_[1]}$line";
}
}
## ~---------------------
## ~ 得到流水號
## ~---------------------
sub getsn{
if ( !( open(SN,"<$sn_url") ) ){&error("$sn_url無法讀取");}
$sn=<SN>;
close(SN);
## 流水號檔內容為空 設為0
if ($sn eq '') {
$sn=0;
}
}
## ~---------------------
## ~ 遞增流水號
## ~---------------------
sub addsn{
$sn++;
if ( !( open(SN,">$sn_url") ) ){&error("$sn_url無法存檔");}
print SN $sn;
close(SN);
}
## ~---------------------
## ~ 發生錯誤
## ~---------------------
sub error{
print "Content-type: text/html; charset=big5\n\n"; ##輸出網頁檔頭
print "發生錯誤 : $_[0]" ;
exit;
}
## ~---------------------
## ~ 確認帳號密碼
## ~---------------------
sub c_idps{
if(($FORM{id} eq $id && $FORM{pass} eq $pass) ||
($COOKIE{id} eq $id && $COOKIE{pass} eq $pass)){
return 1;
}else{
return 0;
}
}
--
VICTOR工作室 | PTT遊戲設計版隆重開幕!
| 不管是新手老手,程式美工音樂企劃....
URL : http://www.kinmen.info/vic/ | 都歡迎來遊戲設計版參與討論 XD
| 戰略高手>
C/C++ | GameTopics>
Visual Basic 6.0 | GameDesign
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.134.242.171
Perl 近期熱門文章
PTT數位生活區 即時熱門文章