作者laechan (挥泪斩马云)
看板mud_sanc
标题Fw: [wizs] 建立纪录档的注意事项
时间Wed Oct 12 15:36:44 2022
※ [本文转录自 mud 看板 #1ZHcv_2m ]
作者: laechan (挥泪斩马云) 看板: mud
标题: [wizs] 建立纪录档的注意事项
时间: Wed Oct 12 15:36:28 2022
这里单纯使用 write_file,其它 log 档函数类似。
例如说在 /open/log/ 目录下我们欲建立一个 eat_pill.log 档,
它是基於玩家拿到 /d/obj/big_pill.c (属性大补帖) 後,使用了
eat pill 指令去服用这颗药丸的纪录,那通常函数是这样写的:
int eat_pill(string str)
{
.
. 中略
.
write("你服下这颗药丸後,感觉精力充沛,浑身充满了干劲!!\n");
write_file("/open/log/eat_pill.log",sprintf("%-12s : %s\n",
this_player()->query("name"),ctime(time()));
this_object()->remove();
return 1;
}
那它会产生什麽问题呢?就是後继者看到这个档案时
1. 它不晓得这个档案是怎麽产生的
2. 它看到的时候可能档案大小已高达数MB
针对第一点,可以改写成底下程式段:
names=this_player()->query("name");
t=ctime(time());
str="";
if(!file_exists("/open/log/eat_pill.log"))
str="/d/obj/big_pill.c eat pill 专用 log 档\n"+
"======================================================\n";
write_file("/open/log/eat_pill.log",sprintf("%s%-12s : %s\n",
str,names,t);
也就是说,如果这个档案不存在,它在产生这个档案的当下,
会在档头附加一段说明文字,让後继者可以知道,这个档案的
产生,是从 /d/obj/big_pill.c 这里来的。
针对第二点,有两种做法,一种是使用 file_size 函数,即
if(file_size("/open/log/eat_pill.log") > 某值)
rm("/open/log/eat_pill.log");
然後再接上面针对第一点所写的程式段即可,这时因为 rm 掉
了,它就会产生新的档案并加上表头,同时因为 rm 掉了产生
的新档案,其 size 还很小,後面陆续添加内容时也不会短时
间 > 某值,就能继续 log 下去。
还有一种做法是 rename
if(file_size("/open/log/eat_pill.log") > 某值)
{
rm("/open/log/eat_pill.old");
rename("/open/log/eat_pill.log","/open/log/eat_pill.old");
}
它会先去砍 .old 档(如果有的话),再把 .log 档 rename 成 .old 档
通常当复数个地方需要使用到 log 档时,将以上的处理包成一
个函数是比较好的做法,需要 log 时就呼叫同一函数来处理,
这样对後继者会是比较友善的做法。
最近因为在 sanc 又使用了 log 档,顺便规划了日後欲采行的
做法,那其实 sanc 目前没後继者,说穿了就是对相当容易健忘
的我来说,是需要采行这种做法的。
(有几个纪录档我就忘记程式段是写在哪些物件上了)
Laechan
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 59.126.145.135 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/mud/M.1665560191.A.0B0.html
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: laechan (59.126.145.135 台湾), 10/12/2022 15:36:44