C#讀取properties文件

 java中有讀取*.properties的專有類,C#中卻沒能找到.今天寫了一個基本的Class,並解決了hashtable中按照讀的順序輸出問題,供大家參考.

/// <summary>
 /// 類名:FileProperties 

 /// 描述:操作*.Properties文件
 /// 作者:Michael
 /// 創建時間:2008-03-11
 /// </summary> 

public class FileProperties : System.Collections.Hashtable
 {

  private ArrayList keys = new ArrayList(); 

  private String fileName = string.Empty;                       //要讀寫的Properties文件名
  /// <summary>
  /// 構造函數
  /// </summary>
  /// <param name="fileName">文件名</param>
  public FileProperties(String fileName)
  {

   this.setFileName(fileName);
   load(fileName);
  }
  
  private void setFileName(string filePath)
  {
   this.fileName = filePath;
  }

/// <summary>
  /// 重寫Add方法,實現按添加順序排列
  /// </summary>
  /// <param name="key">key</param>

///<param name="value">value</param>
  /// <returns></returns>
  public override void Add(object key, object value)
  {
   base.Add (key, value);
   keys.Add (key);
  }
  public override ICollection Keys
  {
   get
   {
    return keys;
   }
  }

/// <summary>
  /// 導入文件
  /// </summary>
  /// <param name="filePath">要導入的文件</param>
  /// <returns></returns>
  public void load(string filePath)
  {
   char[] convertBuf = new char[1024];

   int limit;
   int keyLen;
   int valueStart;
   char c;
   string bufLine = string.Empty;
   bool hasSep;
   bool precedingBackslash;

   using (StreamReader sr = new StreamReader(filePath))
   {
    while(sr.Peek()>=0)
    {
     bufLine = sr.ReadLine();
     limit = bufLine.Length;
     keyLen = 0;
     valueStart = limit;
     hasSep = false;
     
     precedingBackslash = false;
     if(bufLine.StartsWith("#"))
      keyLen = bufLine.Length;

     while(keyLen < limit)
     {
      c=bufLine[keyLen];
      if ((c == '=' ||  c == ':') & !precedingBackslash)
      {
       valueStart = keyLen + 1;
       hasSep = true;
       break;
      }
      else if ((c == ' ' || c == '/t' ||  c == '/f') & !precedingBackslash)
      {
       valueStart = keyLen + 1;
       break;
      }
      if (c == '//')
      {
       precedingBackslash = !precedingBackslash;
      }
      else
      {
       precedingBackslash = false;
      }
      keyLen++;
     }

     while (valueStart < limit)
     {
      c = bufLine[valueStart];
      if (c != ' ' && c != '/t' &&  c != '/f')
      {
       if (!hasSep && (c == '=' ||  c == ':'))
       {
        hasSep = true;
       }
       else
       {
        break;
       }
      }
      valueStart++;
     }

     string key = bufLine.Substring(0,keyLen);
     
     string values = bufLine.Substring(valueStart,limit-valueStart);

     if(key=="")
      key += "#";
     while(key.StartsWith("#")&this.Contains(key))
     {
      key += "#";
     }
     
     this.Add(key,values);
    }
   }
  }

/// <summary>
  /// 保存文件
  /// </summary>
  /// <param name="filePath">要保存的Properties文件</param>
  /// <returns></returns>
  public void save(string filePath)
  {
   if(File.Exists(filePath))
   {
    File.Delete(filePath);
   }
   FileStream fileStream = File.Create(filePath);
   StreamWriter sw = new StreamWriter(fileStream);
   foreach (object  item in keys)
   {
    String key = (String)item;
    String val = (String)this[key];
    if(key.StartsWith("#"))
    {
     if(val== "")
     {
      sw.WriteLine(key);
     }
     else
     {
      sw.WriteLine(val);
     }
    }
    else
    {
     sw.WriteLine(key+"="+val);
    }
   }
   sw.Close();
   fileStream.Close();
  }
 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章