IniHelper.cs
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.IO;
using System.Web;
public class IniHelper {
private static Dictionary< string, object> _cache = new Dictionary< string, object>();
private static Dictionary< string, FileSystemWatcher> _watcher = new Dictionary< string, FileSystemWatcher>();
private static object _lock = new object();
private static object loadAndCache( string path) {
path = TranslateUrl(path);
object ret = null;
if (!_cache.TryGetValue(path, out ret)) {
object value2 = LoadIniNotCache(path);
string dir = Path.GetDirectoryName(path);
string name = Path.GetFileName(path);
FileSystemWatcher fsw = new FileSystemWatcher(dir, name);
fsw.IncludeSubdirectories = false;
fsw.Changed += watcher_handler;
fsw.Renamed += watcher_handler;
fsw.EnableRaisingEvents = false;
lock (_lock) {
if (!_cache.TryGetValue(path, out ret)) {
_cache.Add(path, ret = value2);
_watcher.Add(path, fsw);
fsw.EnableRaisingEvents = true;
} else {
fsw.Dispose();
}
}
}
return ret;
}
private static void watcher_handler( object sender, FileSystemEventArgs e) {
lock (_lock) {
_cache.Remove(e.FullPath);
FileSystemWatcher fsw = null;
if (_watcher.TryGetValue(e.FullPath, out fsw)) {
fsw.EnableRaisingEvents = false;
fsw.Dispose();
}
}
}
public static Dictionary< string, NameValueCollection> LoadIni( string path) {
return loadAndCache(path) as Dictionary< string, NameValueCollection>;
}
public static Dictionary< string, NameValueCollection> LoadIniNotCache( string path) {
Dictionary< string, NameValueCollection> ret = new Dictionary< string, NameValueCollection>();
string[] lines = ReadTextFile(path).Split( new string[] { " \n " }, StringSplitOptions.None);
string key = "";
foreach ( string line2 in lines) {
string line = line2.Trim();
int idx = line.IndexOf( ' # ');
if (idx != - 1) line = line.Remove(idx);
if ( string.IsNullOrEmpty(line)) continue;
Match m = Regex.Match(line, @" ^\[([^\]]+)\]$ ");
if (m.Success) {
key = m.Groups[ 1].Value;
continue;
}
if (!ret.ContainsKey(key)) ret.Add(key, new NameValueCollection());
string[] kv = line.Split( new char[] { ' = ' }, 2);
if (! string.IsNullOrEmpty(kv[ 0])) {
ret[key][kv[ 0]] = kv.Length > 1 ? kv[ 1] : null;
}
}
return ret;
}
public static string ReadTextFile( string path) {
byte[] bytes = ReadFile(path);
return Encoding.UTF8.GetString(bytes).TrimStart(( char) 65279);
}
public static byte[] ReadFile( string path) {
path = TranslateUrl(path);
if (File.Exists(path)) {
// string destFileName = Path.GetTempFileName();
// File.Copy(path, destFileName, true);
string destFileName = path;
int read = 0;
byte[] data = new byte[ 1024 * 8];
MemoryStream ms = new MemoryStream();
using (FileStream fs = new FileStream(destFileName, FileMode.OpenOrCreate, FileAccess.Read)) {
do {
read = fs.Read(data, 0, data.Length);
if (read <= 0) break;
ms.Write(data, 0, read);
} while ( true);
fs.Close();
}
// File.Delete(destFileName);
data = ms.ToArray();
ms.Close();
return data;
}
return new byte[] { };
}
public static string TranslateUrl( string url) {
return TranslateUrl(url, null);
}
private static object _ecd_lock = new object();
public static string TranslateUrl( string url, string baseDir) {
if ( string.IsNullOrEmpty(url)) url = "";
if (! string.IsNullOrEmpty(baseDir) && !url.StartsWith( " ~/ ") && !url.StartsWith( " / ")) {
baseDir = Path.GetDirectoryName(baseDir);
if (HttpContext.Current != null)
url = Path.GetFullPath(baseDir + " \\ " + url);
else {
lock (_ecd_lock) {
string ecd = Environment.CurrentDirectory;
Environment.CurrentDirectory = baseDir;
url = Path.GetFullPath(url);
Environment.CurrentDirectory = ecd;
}
}
} else {
if (url.IndexOf( " :\\ ") == - 1) {
if (System.Web.HttpContext.Current != null)
url = System.Web.HttpContext.Current.Server.MapPath(url);
else
url = Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + " \\ " + url.Trim( ' \\ ', ' ~ '));
}
}
return url;
}
}
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.IO;
using System.Web;
public class IniHelper {
private static Dictionary< string, object> _cache = new Dictionary< string, object>();
private static Dictionary< string, FileSystemWatcher> _watcher = new Dictionary< string, FileSystemWatcher>();
private static object _lock = new object();
private static object loadAndCache( string path) {
path = TranslateUrl(path);
object ret = null;
if (!_cache.TryGetValue(path, out ret)) {
object value2 = LoadIniNotCache(path);
string dir = Path.GetDirectoryName(path);
string name = Path.GetFileName(path);
FileSystemWatcher fsw = new FileSystemWatcher(dir, name);
fsw.IncludeSubdirectories = false;
fsw.Changed += watcher_handler;
fsw.Renamed += watcher_handler;
fsw.EnableRaisingEvents = false;
lock (_lock) {
if (!_cache.TryGetValue(path, out ret)) {
_cache.Add(path, ret = value2);
_watcher.Add(path, fsw);
fsw.EnableRaisingEvents = true;
} else {
fsw.Dispose();
}
}
}
return ret;
}
private static void watcher_handler( object sender, FileSystemEventArgs e) {
lock (_lock) {
_cache.Remove(e.FullPath);
FileSystemWatcher fsw = null;
if (_watcher.TryGetValue(e.FullPath, out fsw)) {
fsw.EnableRaisingEvents = false;
fsw.Dispose();
}
}
}
public static Dictionary< string, NameValueCollection> LoadIni( string path) {
return loadAndCache(path) as Dictionary< string, NameValueCollection>;
}
public static Dictionary< string, NameValueCollection> LoadIniNotCache( string path) {
Dictionary< string, NameValueCollection> ret = new Dictionary< string, NameValueCollection>();
string[] lines = ReadTextFile(path).Split( new string[] { " \n " }, StringSplitOptions.None);
string key = "";
foreach ( string line2 in lines) {
string line = line2.Trim();
int idx = line.IndexOf( ' # ');
if (idx != - 1) line = line.Remove(idx);
if ( string.IsNullOrEmpty(line)) continue;
Match m = Regex.Match(line, @" ^\[([^\]]+)\]$ ");
if (m.Success) {
key = m.Groups[ 1].Value;
continue;
}
if (!ret.ContainsKey(key)) ret.Add(key, new NameValueCollection());
string[] kv = line.Split( new char[] { ' = ' }, 2);
if (! string.IsNullOrEmpty(kv[ 0])) {
ret[key][kv[ 0]] = kv.Length > 1 ? kv[ 1] : null;
}
}
return ret;
}
public static string ReadTextFile( string path) {
byte[] bytes = ReadFile(path);
return Encoding.UTF8.GetString(bytes).TrimStart(( char) 65279);
}
public static byte[] ReadFile( string path) {
path = TranslateUrl(path);
if (File.Exists(path)) {
// string destFileName = Path.GetTempFileName();
// File.Copy(path, destFileName, true);
string destFileName = path;
int read = 0;
byte[] data = new byte[ 1024 * 8];
MemoryStream ms = new MemoryStream();
using (FileStream fs = new FileStream(destFileName, FileMode.OpenOrCreate, FileAccess.Read)) {
do {
read = fs.Read(data, 0, data.Length);
if (read <= 0) break;
ms.Write(data, 0, read);
} while ( true);
fs.Close();
}
// File.Delete(destFileName);
data = ms.ToArray();
ms.Close();
return data;
}
return new byte[] { };
}
public static string TranslateUrl( string url) {
return TranslateUrl(url, null);
}
private static object _ecd_lock = new object();
public static string TranslateUrl( string url, string baseDir) {
if ( string.IsNullOrEmpty(url)) url = "";
if (! string.IsNullOrEmpty(baseDir) && !url.StartsWith( " ~/ ") && !url.StartsWith( " / ")) {
baseDir = Path.GetDirectoryName(baseDir);
if (HttpContext.Current != null)
url = Path.GetFullPath(baseDir + " \\ " + url);
else {
lock (_ecd_lock) {
string ecd = Environment.CurrentDirectory;
Environment.CurrentDirectory = baseDir;
url = Path.GetFullPath(url);
Environment.CurrentDirectory = ecd;
}
}
} else {
if (url.IndexOf( " :\\ ") == - 1) {
if (System.Web.HttpContext.Current != null)
url = System.Web.HttpContext.Current.Server.MapPath(url);
else
url = Path.GetFullPath(AppDomain.CurrentDomain.BaseDirectory + " \\ " + url.Trim( ' \\ ', ' ~ '));
}
}
return url;
}
}