Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4728271
  • 博文数量: 206
  • 博客积分: 5240
  • 博客等级: 大校
  • 技术积分: 3224
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 21:40
文章分类

全部博文(206)

文章存档

2013年(13)

2012年(8)

2011年(33)

2010年(152)

我的朋友

分类:

2011-06-29 21:16:15


库源码

//ini文件操作
namespace fsys; 

//转换文件路径,并保证ini一定存在
var getIniPath = function(path){
    
if(!path)
        
error("请指定ini文件路径",3)
    
var fullpath = ..io.exist(path) ;
    
if(!fullpath) {
        
var defult = ..string.load(path):"" //支持从资源文件加载默认ini文件
        ..string.save(path,"")
        fullpath  = ..io.exist(path) ;
        
if( ! fullpath  )
            
error("ini文件不存在" + path,3)
    }
    
return fullpath;
}


class ini{
        
ctor(path){  
            path = getIniPath(path);
        };         
        read = 
function(app=null,key=null,default = ""){
                
var getlen=512
                
var len,val = GetPrivateProfileString(app,key,default,getlen,getlen,path)
                
while(len >= getlen-2){
                    getlen+=512;
                    len,val = GetPrivateProfileString(app,key,default,getlen,getlen,path)
                }
                
if(!len)
                    
return;
                    
                
if(!key) 
                    
return ..string.split(..string.left(val,len-1),'\0'); 
                
else {
                    
return ..string.left(val,len);
                }
                


        };
        write = 
function(app,key,str){ 
            WritePrivateProfileString(app,key,str?
tostring(str):null,path); 
        };
        readSectionNames = 
function(){
            
return this.read();
        } 
        readKeys = 
function(app){
              
return this.read(app);
        }  
        getSectionNames = 
function(){
            
var getlen=512
            
var len,val = GetPrivateProfileSectionNames( getlen,getlen,path)
            
while(len >= getlen-2){
                getlen+=512;
                len,val = GetPrivateProfileSectionNames( getlen,getlen,path)
            }
            
if(!len)
                
return null;
            val = ..string.left(val,len-1);
            
return ..string.split(val,'\0');
        }
        getSection = 
function(app){
            
return app?section(path,app);
        }  
        eachSection = 
function(){
            
var secs = this.getSectionNames() : {};
            
var i = 0;
            
return function(){ 
                i++;
                
return secs[i]?section(path,secs[i]) ;
            } 
            
        } 
}

namespace ini{   
    GetPrivateProfileString = ::Kernel32.api(
"GetPrivateProfileStringA","int(string lpApplicationName,string lpKeyName,string lpDefault,string & lpReturnedstring,int nSize,string lpFileName)"); 
    WritePrivateProfileString = Kernel32.api(
"WritePrivateProfileStringA","int(string lpAppName,string lpKeyName,sting lpString,string.lpFileName)");
    GetPrivateProfileSectionNames = ::Kernel32.api(
"GetPrivateProfileSectionNamesA","int(string &buffer,int size,str file)"); 
}

class ini.section{
    
ctor(path,app){
        
if(!app )
            
error("请指定ini文件[小节名字]",2) 
            
        path = getIniPath(path);
                
        
var getlen=512
        
var len,val = GetPrivateProfileSection(app, getlen,getlen,path)
       
        
while(len >= getlen-2){
            getlen+=512;
            len,val = GetPrivateProfileSection(app, getlen,getlen,path)
        }
        
if(len){
            val = ..string.left(val,len-1);
            
var tlist  =  ..string.split(val,'\0');
            
var pos,k;
            
for( i,v in tlist){  
                pos = ..string.find(v,
"@=");
                
if(pos){ 
                    k = ..string.trim(..string.left(v,pos-1));  
                    
this[k] = ..string.trim( ..string.sub(v,pos+1) );
                }
            }
             
        } 
        
        this@  = { 
            save = 
function(){
            
var t = {}
            
for(k,v in this){
                
if(type(v)!=type.function){
                    ..table.push(t,k);
                    ..table.push(t,
"=");
                    ..table.push(t,v); 
                    ..table.push(t,
'\0');
                }
            }
            ..table.push(t,
'\0'); 
            ..table.push(t,
'\0'); 
            
var v = ..string.join(t ); 
            WritePrivateProfileSection( app,v,path); 
            }
        } 
        
//将save函数放在元表中,这样当使用for in遍历ini.section对象时,就看不到save函数 
        this@._get = this@ 
        
    }
     
}

namespace ini.section{
    GetPrivateProfileSection = ::Kernel32.api(
"GetPrivateProfileSectionA","int(string app,string &buffer,int size,STRING file)");
    WritePrivateProfileSection = ::Kernel32.api(
"WritePrivateProfileSectionA","int(string app,string buffer,STRING file)");
}



/**intellisense()
fsys.ini = ini文件读写
fsys.ini("__") = 打开ini文件
!ini.read("小节名称","项名或条目名","默认值") = 读取ini
!ini.read("小节名称","项名或条目名")= 读取ini
!ini.write("小节名称","项名或条目名","新值") = 写ini文件
!ini.readSectionNames() = 返回小节名称数组
!ini.readKeys("小节名称") = 返回指定小节中所有项名的一个列表 
!ini.getSectionNames() = 获取所有小节名字,返回数组.
!ini.getSection("__/*小节名称*/") = 读取或添加ini.section对象,可直接读写成员.
!inisection.save() = 保存更改到ini文件
?ini.getSection = !inisection.
!ini.eachSection() = @for section in __/*输入ini对象名字*/.eachSection() { 
    for(k,v in section){
        io.print(k,v)    
    } 
    section.new = 123;
    section.save();
}
?fsys.ini = !ini.
end intellisense**/


示例

import fsys.ini

//打开文件,支持内嵌资源文件
//如果文件不存在则自动创建新文件
ini=fsys.ini("\配置文件.ini")

//读取小节对象
sec = ini.getSection("小节名称")

//读写值
sec.项名称 = 123;

//保存
sec.save() 
==============================
显示

[小节名称]
项名称=123

*****************************
删除ini文件中得某个键示例
import fsys.ini;

var ini = fsys.ini("C:\1.ini");
ini.write("Database", "Host", "localhost");
ini.write("Database", "Port", "3306");

ini.write("Database", "Host"); // 删除 Host






阅读(2481) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

劲松电器2015-05-15 14:44:29

后来看了下和快手现在自带的ini库是一样的,还是感谢了

劲松电器2015-05-15 14:39:40

摘抄学习并偷走啦,话说在AAuto里面不是用配置表 fsys.table更方便吗?不过各有好处,偷走了,谢谢