2011-12-03 | #1 |
高级会员
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望:
50
现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0 |
批处理的Update
发信人: puss (幽幽一猫无心细语), 信区: wiz 标 题: 在MUD中加强功能的update命令(转) 发信站: 西北网络中心兵马俑 BBS 站 (Wed Jun 2 05:52:53 1999) 在MUD中加强功能的update命令 作者:文月 公用的命令update的功能很差劲,只能一个一个文件地update 在有些需要大量update的情况下使用update很麻烦 这个问题在upgrade mudos之后更加严重, 因为有大量的程序不能不做任何修改运行在新的MUDOS之上。 有不少MUD自己都已经改写了UPDATE程序, 能够一次更新整个目录但是由于现在MUD站之间的现状, 往往这样的小程序都作为了MUD的机密文件,不肯公开。 找人要不到,没办法,只好自己写了, 我把ls.c和原始的update.c 两个程序 放在一起加了点语句,花了几分钟改了改, 合成了下面这个upddir.c,下面这个程序可以更新整个目录。 希望对还没有写这个功能的WIZ们有点用处。 // upddir.c //这个命令可以用来更新某个目录下以及所有子目录下的文件 //命令创建者win@SXTX ,email:wen_yue@163.net #include "/doc/help.h" inherit F_CLEAN_UP; int updatefile(object me,string file); int main(object me, string arg) { int i, j; string dir; mixed *file; seteuid( geteuid(me) ); dir = resolve_path(me->query("cwd"), arg); if( file_size(dir)==-2 && dir[strlen(dir)-1] != '/' ) dir += "/"; file = get_dir(dir, -1); if( !sizeof(file) ) {if (file_size(dir) == -2) return notify_fail("目录是空的。\n"); else return notify_fail("没有这个目录。\n"); } i = sizeof(file); while(i--) { if (file[i][1]==-2) file[i][0] += "/"; } write("目录:" + dir + "\n"); if (sizeof(file)) for(i=0, j = sizeof(file); i < j; i++) { if (file[i][1]!=-2 && sscanf(file[i][0], "%*s.c") && file[i][0][strlen(file[i][0])-1]=="c"[0] && file[i][0][strlen(file[i][0])-2]=="."[0]) updatefile(me,dir+file[i][0]); else if (file[i][1]==-2) call_other(__FILE__,"main", me,dir+file[i][0]); } else write(" 没有任何档案。\n"); write("\n"); return 1; } int updatefile(object me,string file) { object obj,*inv; int i; string err; me->set("cwf", file); if (obj = find_object(file)) { if( obj==environment(me) ) { if( file_name(obj)==VOID_OB ) return notify_fail("你不能在 VOID_OB 里重新编译 VOID_OB。\n"); inv = all_inventory(obj); i = sizeof(inv); while(i--) if( userp(inv[i]) ) inv[i]->move(VOID_OB, 1); else inv[i] = 0; } destruct(obj); } if (obj) return notify_fail("无法清除旧程式码。\n"); write("重新编译 " + file + ":"); err = catch( call_other(file, "???") ); if (err) printf( "发生错误:\n%s\n", err ); else { write("成功!\n"); if( (i=sizeof(inv)) && (obj = find_object(file))) { while(i--) if( inv[i] && userp(inv[i]) ) inv[i]->move(obj, 1); } } } int help(object me) { write(@HELP 指令格式: upddir [<路径名>] 将目录下所有的子目录及档案, 如果没有指定目录, 则使用当前目录 范例: 'upddir /adm' 会将所有位於根/adm目录下的档案编译更新. HELP ); return 1; } -- |
|