一定期間になれば、ファイルに保存した内容を書き換えるには?

[上に] [前に] [次に]
AKI♂ [E-Mail] [HomePage] 1999/08/11(水) 19:46:03
CGIで、ファイルに保存した内容(フォームで登録した内容)
を、1ヶ月間アクセスがないと削除したいのですが
サブルーチンとかありますか?perlで!

ふじ 1999/08/11(水) 21:08:04
Perlじゃないですけど、

rm `find /hoge -atime +10`

とすると /hoge ディレクトリ以下にある、10日間以上
アクセスされていないファイルを全て消します。

これを crontab で定期的に動かしてやればよいのでは。

crontabが使えないなら、CGIから上記のコマンドを
実行してやればよいでしょう。

system "rm `find /hoge -atime +10`";

ただ、そのCGIが実行されないと当然ながら消せませんが。

AKI♂ [E-Mail] 1999/08/11(水) 22:00:36
ふじさん、すみません説明不足で!
1
2
3
というのがファイルにあると仮定して
1・2・3は同じファイルの中にあります!
もし、2番だけを消すには?
3つとも、書きこみ日は異なります!
こう言うことは、できますか?

ST 1999/08/11(水) 22:08:43
> 1ヶ月間アクセスがないと削除
ということですが,まずはアクセスするごとにアクセス日を記録する必要が生じてきます。もし書き込みしてから一ヶ月,というのであれば話はもっと簡単ですが。
今度の場合は前者ですね?

AKI♂ 1999/08/11(水) 23:07:13
STさんどうも、です!
最終書きこみ日から、1ヶ月です!
「ID・ニックネーム・書きこみ日」がファイルに保存されてますので
書き込み日から1ヶ月たつとそのIDの行を削除したいのです!
できますか?

ふじ 1999/08/12(木) 01:42:15
../199908/99080108.htm
これを参考にすれば出来ますかね?

AKI♂ 1999/08/12(木) 23:24:25
ふじさん、こんにちは!
欲をいえば。
ユーザーが登録しているファイルと
書き込みしたファイルが別で!
ユーザー登録の方のファイルにID&登録日があり!
書き込みしたファイルの同じIDの最終書き込みが
登録日から30日書き込みがなかったら
登録してるファイルのIDが削除されるようにしたいのですが!
無理ですか?

ふじ 1999/08/13(金) 01:29:04
無理じゃないです。

Perlでやるなら例えば・・・
1.timelocal.pl を使う。
require "timelocal.pl";

2.ユーザー登録ファイルを読み込んで各IDをキーにして登録日をデータにした
ハッシュを作る。
$date{ID} = &timelocal($sec,$min,$hours,$mday,$mon,$year);

3.削除したい行があるファイルを読み込んで、
if((time - $date{ID}) >= 60*60*24*30){
消す
}else{
消さない
}

というような処理をすればよいかと。

ふじ 1999/08/13(金) 15:18:24
上記の発言は取り消し。なんか勘違いしてたみたい。<私

で、よく読みなおしてみると意味不明なところが・・・

>書き込みしたファイルの同じIDの最終書き込みが
>登録日から30日書き込みがなかったら
ここがよく分からないです。
「登録したものの30日間書き込みがない」
#でもこれだと「最終書き込み」でなくて「最初の書き込み」だなあ。

という意味か、それとも
「現在から過去30日間に書き込みがない」
という意味か、はたまた全然別の意味なのか・・・

AKI♂ 1999/08/13(金) 18:53:26
また、説明不足ですみません!
最終書き込みから30日間書き込みのない人の登録IDを削除したいのです
「現在から過去30日間に書き込みがない」
という意味です
一応、改造したい(現稼動)CGIページかいておきます!http://village.infoweb.ne.jp/~fwgj8769/bbs/pobox.cgi

ふじ 1999/08/13(金) 20:10:26
>最終書き込みから30日間書き込みのない人の登録IDを削除したいのです
それならば、

1.書き込みファイルを読んで各ID毎の最終書き込み日を得る。
$date = &timelocal($sec,$min,$hours,$mday,$mon,$year);
$last{ID} = $date if $last{ID} < $date;

2.ユーザー登録ファイルを開いて
if ((time - $last{ID}) >= 60*60*24*30){
消す
}else{
消さない
}
とすれば良いでしょう。

AKI♂ 1999/08/14(土) 13:46:14
ふじさん、こんにちは!
この文は、CGIの中に書き込むのですか?
それとも、違うファイルを製作するのですか?
改造したいCGIのperl文は下記の場所にあります!参考にしてください
http://village.infoweb.ne.jp/~fwgj8769/bbs/a.txt

ふじ 1999/08/14(土) 15:09:33
そのCGIスクリプトの中に書き込んでも良いし、
別のスクリプトとして作って定期的に crontab を使って
動かしてやっても良いです(crontab が使えるならば)。

どちらでもお好きな方で。

AKI♂ 1999/08/14(土) 15:40:38
もし、CGIスクリプトに書き込む場合は!
書き込みファイルに
$last{ID} が、かきこまれるのですか?
今一つ、どこに書き込むか理解してません。
すみません、初心者で!

ふじ 1999/08/15(日) 14:40:42
上記の例で出した $last{ID} は、各ID毎の最終書き込みを得るための
ハッシュなので、特にファイルに保存する必要はありません。

AKI♂ 1999/08/15(日) 16:21:36
ふじさん、こんにちは
わからない所が!
>1.書き込みファイルを読んで
と書いてありますが、その書き込みファイルを呼び出すperl文を
作ってから、その後に$date = &timelocalと書いて行くのですか?

ふじ 1999/08/16(月) 01:50:45
取りあえず要点部分のソースを(適当に)書くと・・・

require "timelocal.pl";

open (KAKIKOMI, "< kakikomi_file");
while(<KAKIKOMI>){
($id, $nickname, $year, $mon, $day) = split(/$delimiter/);
$year -= 1900;
$mon-- ;
$date = &timelocal(0, 0, 0, $day, $mon, $year);
$last{$id} = $date if $last{$id} < $date;
}
close KAKIKOMI;

open (USER, "< user_file");
open (OUT , "> user_file.temp");
while(<USER>){
($id) = split(/$delimiter/);
print OUT $_ if (time - $last{$id}) <= 60*60*24*30));
}
close USER;
close IN;
rename "user_file.temp" , "user_file";

大体こんな感じの処理になるのではないかと。
#ロック処理とかはしてません。

いきなり CGI を改造してしまうのではなくて、
上記のファイル操作の部分だけを短いスクリプトで書いて
実験してみてからの方が良いでしょう(当然ですが)

#で、失礼ですが、もし上記のソースを読んで何をやっているのかが
#分からなければ、手を出すのはもう少しPerlプログラミングの
#経験を積んでからの方がよろしいかと。

AKI♂ 1999/08/16(月) 10:34:15
[[解決]]
ふじさん、長い事つきあってもらいありがとうございました!
とりあえず、教えてもらった事を勉強しつつ自分なりにやってみます。

[上に] [前に] [次に]