zoukankan      html  css  js  c++  java
  • 配置文件读写

    • 使用ini为后缀的配置文件

    • 使用第三方库为

      go get gopkg.in/gcfg.v1
      
    • 代码样例

      package main
      
      import(
      	"os"
      	"fmt"
      	"log"
      	"time"
      	"gopkg.in/gcfg.v1"
      )
      var path string = "conf.ini"
      var config *Config
      
      // 获取配置文件相对应的信息
      type Config struct{
      	User map[string]*struct{
      		UID string
      		Pid string
      	}
      }
      
      
      func init(){
      	log.SetFlags(log.Lshortfile|log.Ltime)
      	config = &Config{}
      }
      
      // 读取
      func readConfig()(err error){
      	if path==""{
      		err =  fmt.Errorf("path is null")
      		log.Println(err)
      		return
      	}
      	log.Println("读取配置文件")
      	err = gcfg.ReadFileInto(config,path)
      	if err!=nil{
      		err = fmt.Errorf("Failed to parse config file:%s",err)
      		log.Println(err)
      		return
      	}
      	return
      }
      
      func prinfConfigInfo()(err error){
      	defer func(){
      		if r:=recover();r!=nil{
      			err = r.(error)
      		}
      	}()
      	log.Println("每个10秒打印配置文件")
      	ticker := time.NewTicker(10*time.Second)
      	for{
      		select {
      		case <-ticker.C:
      			for key,value := range config.User{
      				log.Printf("%v uid=%v pid=%v 
      ",key,key,value)
      			}
      		}
      	}
      }
      func main(){
      	fmt.Println("读取配置文件信息")
      	err := readConfig()
      	if err!=nil{
      		log.Println(err)
      		return
      	}
      	fmt.Println("打印配置信息")
      	err = prinfConfigInfo()
      	if err!=nil{
      		log.Println(err)
      	}
      }
      
    • 配置文件内容(conf.ini)

      [user "A"]
      uid = 45
      pid = 54
      
      [user "B"]
      uid = 12
      pid = 12
      

    思考:在整个项目中,要是需要修改到配置文件,是否需要在手动停止项目,修改之后,在手动开启项目呢?

    • 手动的原因:内存中已经存有修改前的配置文件信息,要是单单修改配置文件,是不会把新的配置文件信息,存到内存中的。因此。。。。
    • 也可以不用,只要对配置文件进行热更新就行

    样例代码

    package main
    
    import(
    	"os"
    	"fmt"
    	"log"
    	"time"
    	"sync/atomic"
    	"gopkg.in/gcfg.v1"
    )
    var path string = "conf.ini"
    var lastModTime = time.Now().Unix() // 获取目前的时间
    var config *Config
    
    // 获取配置文件相对应的信息
    type Config struct{
    	User map[string]*struct{
    		UID string
    		Pid string
    	}
    }
    
    
    func init(){
    	log.SetFlags(log.Lshortfile|log.Ltime)
    	config = &Config{}
    }
    
    // 读取
    func readConfig()(err error){
    	if path==""{
    		err =  fmt.Errorf("path is null")
    		log.Println(err)
    		return
    	}
    	log.Println("读取配置文件")
    	err = gcfg.ReadFileInto(config,path)
    	if err!=nil{
    		err = fmt.Errorf("Failed to parse config file:%s",err)
    		log.Println(err)
    		return
    	}
    	return
    }
    
    func prinfConfigInfo()(err error){
    	defer func(){
    		if r:=recover();r!=nil{
    			err = r.(error)
    		}
    	}()
    	log.Println("每个10秒打印配置文件")
    	ticker := time.NewTicker(10*time.Second)
    	for{
    		select {
    		case <-ticker.C:
    			for key,value := range config.User{
    				log.Printf("%v uid=%v pid=%v 
    ",key,key,value)
    			}
    		}
    	}
    }
    func monitor(){
    	log.Println("设置监听时间")
    	ticker := time.NewTicker(10*time.Second)
    	log.Println("启动监听器")
    	for{
    		select{
    			case <-ticker.C:
    				// 使用匿名函数是关闭文件
    				func(){
    					if path==""{
    						err :=  fmt.Errorf("path is null")
    						log.Println(err)
    						return
    					}
    					fmt.Println("打开配置文件")
    					file,err := os.Open("conf.ini")
    					if err!=nil{
    						err = fmt.Errorf("打开配置文件错误:%v",err)
    						log.Println(err)
    						return
    					}
    					defer file.Close()
    					fmt.Println("获取配置信息")
    					fileInfo,err := file.Stat()
    					if err!=nil{
    						err = fmt.Errorf("获取配置文件信息错误:%v",err)
    						log.Println(err)
    						return
    					}
    					modtime := fileInfo.ModTime()
    					if modtime.Unix()>lastModTime{
    						log.Println("配置文件已经修改啦,通知各个部门")
    						lastModTime = modtime.Unix()
    						err:= readConfig()
    						if err!=nil{
    							err = fmt.Errorf("重新读取配置文件错误:%v",err)
    							log.Println(err)
    							return
    						}
    					}else{
    						return
    					}
    				}()					
    		}
    	}
    }
    
    func main(){
    	fmt.Println("读取配置文件信息")
    	log.Println("监听文件是否修改")
    	go monitor()
    	err := readConfig()
    	if err!=nil{
    		log.Println(err)
    		return
    	}
    	fmt.Println("打印配置信息")
    	err = prinfConfigInfo()
    	if err!=nil{
    		log.Println(err)
    	}
    }
    

    总结

    • time.Ticker适合用来制作监听器
  • 相关阅读:
    使用 asp.net mvc和 jQuery UI 控件包
    ServiceStack.Redis 使用教程
    HTC T8878刷机手册
    Entity Framework CodeFirst 文章汇集
    2011年Mono发展历程
    日志管理实用程序LogExpert
    使用 NuGet 管理项目库
    WCF 4.0路由服务Routing Service
    精进不休 .NET 4.0 (1) asp.net 4.0 新特性之web.config的改进, ViewStateMode, ClientIDMode, EnablePersistedSelection, 控件的其它一些改进
    精进不休 .NET 4.0 (7) ADO.NET Entity Framework 4.0 新特性
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/11748243.html
Copyright © 2011-2022 走看看