[問題] 檔案會變成empty@@"

看板Perl作者 (Victor)時間19年前 (2006/09/14 17:28), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
我的網站有一個很久以前寫的下載管理程式,平時運作還正常 但是就是有一點很奇怪,隔一段時間,下載的資料檔會突然變成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/\,/&#44;/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
文章代碼(AID): #152I2lX5 (Perl)
文章代碼(AID): #152I2lX5 (Perl)