//config 配置文件 import fsys; import fsys.table; namespace fsys; class config{ ctor( cfgDir = "/config/",cfgDir2 ) { if(cfgDir2 && !..fsys.isDir(cfgDir) ){ cfgDir = cfgDir2; } if( _cache[cfgDir] ) return _cache[cfgDir]; this._cfgDir = cfgDir; _cache[cfgDir] = this; ..subscribe("beforeSystemEndSesssion",function(){ this.saveAll(); } ) }; @_meta; }; namespace config{ _cache = { @{_weak="kv"}; } _meta = { saveAll = function(){ for(k,cfg in owner) { if( ( type(k) != "string" ) || ( k[1] == '_'# ) ) continue; if( ( type(cfg) =="table" ) ? cfg.save ){ cfg.save(); } } }; _get = function(k) { if( type(k) != type.string ) return; if(k[1] == '_'#) // e.g. _safearray,_struct return; if( k == "saveAll" ){ return self._meta.saveAll; } var cfg = ..fsys.table( ..io.joinpath( owner[["_cfgDir"]] , k + ".table" ) ); owner[[k]] = cfg; return cfg; } _set = function(k,v){ if( ( type(k) == "string" ) && ( k[1] == '_'# ) ){ owner[[k]] = v; return; } error('fsys.config对象的成员对应只读的配置文件名称,不可修改!',2);//可使用 [[]] 操作符修改 } } }; /**intellisense() fsys.config = 基于 fsys.table 的配置文件对象。\nfsys.config 对象用不以下划线开始的名字获取成员会返回 fsys.table 对象。\nfsys.table 可作为普通 table 对象使用,\n在线程退出时将会同步存储到文件中。\n\nfsys.table 并非实时读写,而是将配置读入内存。\n所以请不要多对象、多线程、多进程打开同一配置文件。\n这会导致多份不同步的配置写入存储设备时会相互覆盖。\n\n注意此对象不可跨线程传递。\n多线程可通过 winform 成员函数转发到界面线程操作配置文件即可,\n多进程可利用原子窗体、进程互斥体避免冲突 fsys.config( = 创建 fsys.config 对象。\nfsys.config 对象用不以下划线开始的名字获取成员会返回 fsys.table 对象 fsys.config(.(默认配置目录,备选配置目录) = 参数 @1 指定默认目录,省略则默认使用 "/config/" 目录。\n如果默认配置目录不存在,且指定了备选配置目录,\n则改用备选配置目录。否则自动创建默认配置目录。\n可用 io.appData 函数指定 %LocalAppData% 目录的子目录。\n\n使用非下划线开始的名字获取 fsys.config 对象成员时,\n返回指向配置目录下同名配置文件的 fsys.table 对象。\n\n一般只应当在主线程中有一个指向同一配置目录的 fsys.config 对象,\n以避免 fsys.table 指向同一个硬盘文件则保存时会相互覆盖 fsys.config() = !fsys_config. !fsys_config.saveAll() = 写入所有成员 fsys.table 对象到配置文件 !fsys_config.? = 获取值时指定不以下划线开始的配置表名称,\n返回一个可自动序列化到同名配置文件的表对象。\n如果此对象名以下划线开始,则可以正常读写值不会序列化为配置文件。\n否则不能对此对象直接赋值,只能对配置表对象的成员赋值。\n\n配置表可自动自文件加载,退出线程前自动序列化并存入文件。\n仅序列化以字符串、数值为键的元素,\n仅序列化值为字符串、数值、buffer 以及定义了 _serialize 元方法的成员。\n循环引用的值转换为 null,序列化时忽略成员函数\n!fsys_table. end intellisense**/