C# 文件操作 通用接口(Ini,Xml,Json)

C# 文件操作


简介

大致思路:
1.定义一个IFileBase接口,提供文件基本操作,各个文件操作基于它来实现接口。
2.定义FileHelper类,类中定义一个接口变量 IFileBase file用于不同文件操作
3.不同文件类:XMLHalper,INIHalper,JsonHalper实现IFileBase接口对不同文件进行操作


一、IFileBase接口

代码如下:

    public interface IFileBase
    {

        /// <summary>
        /// 写文件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tableName"></param>
        /// <param name="id"></param>
        /// <param name="data"></param>
        /// <returns></returns>
        short Write<T>(string tableName, string id, T data);

        /// <summary>
        /// 写文件
        /// </summary>
        /// <param name="path"></param>
        /// <param name="Section"></param>
        /// <param name="Key"></param>
        /// <param name="Value"></param>
        short WriteINI(string path, string Section, string Key, string Value);

        /// <summary>
        /// 读取文件
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tablename"></param>
        /// <returns></returns>
         short Read<T>(string tablename,ref T Value);

        /// <summary>
        /// 读取文件
        /// </summary>
        /// <param name="tablename">路径名</param>
        /// <param name="id">节点名</param>
        /// <param name="Key">键名</param>
        /// <returns></returns>
        short ReadINI(string tablename, string id, string Key,ref string data);

    }

二、FileHelper文件操作类

不涉及文件的具体操作,只用设置对应的文件类型,调用接口即可

   public enum FileType
    {
        INIFile=0,
        XMLFile,
        JSONFile,
    }

代码如下:

   public class FileHelper : IFileHalperBase
    {
        public FileType type = FileType.INIFile;
        IFileBase file = new INIHalper();
        public FileHelper()
        {
        }

        public FileHelper(FileType fileType)
        {
            type = fileType;
            switch (fileType)
            {
                case FileType.INIFile:
                    file = new INIHalper();
                    break;
                case FileType.XMLFile:
                    file = new XMLHalper();
                    break;

                case FileType.JSONFile:
                    file = new JsonHalper();
                    break;

                default:
                    break;
            }
        }

        public void SetType(string dbType)
        {
            type = (FileType)Enum.Parse(typeof(FileType),dbType);
            switch (type)
            {
                case FileType.INIFile:
                    file = new INIHalper();
                    break;
                case FileType.XMLFile:
                    file = new XMLHalper();
                    break;

                case FileType.JSONFile:
                    file = new JsonHalper();
                    break;

                default:
                    break;
            }
        }



        public short Read<T>(string tablename, string id, ref T data)
        {
            return file.Read<T>(tablename, ref data);
        }

        public short Write<T>(string tableName, string id, T data)
        {
            if (!File.Exists(tableName))
            {
                File.Create(tableName);
            }
            return file.Write<T>(tableName, id, data);
        }

        public short Write<T>(string tableName, string id, List<T> data)
        {
            throw new NotImplementedException();
        }

        public short ReadList<T>(string tablename, ref List<T> data)
        {
            throw new NotImplementedException();
        }


        public short ReadINI(string tablename, string id, string Key, ref string Value)
        {
            return file.ReadINI(tablename, id,  Key, ref Value);
        }

        public short WriteINI(string path, string Section, string Key, string Value)
        {
            if (!File.Exists(path))
            {
                return -1;
            }
            return file.WriteINI(path, Section, Key, Value);
        }


    }

三、不同类型文件操作接口实现

1.INI文件

代码如下:

    class INIHalper : IFileBase
    {

        #region **************INIFileHelper****************

        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);


        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string defVal, Byte[] retVal, int size, string filePath);
        
        /// <summary>
        /// 写INI文件
        /// </summary>
        /// <param name="Section"></param>
        /// <param name="Key"></param>
        /// <param name="Value"></param>
        public void IniWriteValue(string path, string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, path);
        }

        /// <summary>
        /// 读取INI文件
        /// </summary>
        /// <param name="Section">INI文件中的一个字段名</param>
        /// <param name="Key">键名</param>
        /// <returns></returns>
        public string IniReadValue(string path,string Section, string Key)
        {
            StringBuilder temp = new StringBuilder(255);
            int i = GetPrivateProfileString(Section, Key, "", temp, 255, path);
            return temp.ToString();
        }

        public byte[] IniReadValues(string path,string section, string key)
        {
            byte[] temp = new byte[255];
            int i = GetPrivateProfileString(section, key, "", temp, 255, path);
            return temp;

        }

        /// <summary>
        /// 反序列化
        /// </summary>
        /// <returns></returns>
        T Deserialize<T>(ref T Value,string path)
        {
            Type tInfo = Value.GetType();
            string section = tInfo.Name;
            foreach (PropertyInfo p in tInfo.GetProperties())
            {
                string key = p.Name;
                string iniValue = IniReadValue(path, section, key);
                if (iniValue == string.Empty)
                {
                    PropertyInfo pd = Value.GetType().GetProperty(key);
                    iniValue = pd.GetValue(Value, null) as string;
                }
                //string v = p.PropertyType == null ? "" : p.PropertyType.ToString();
                //object value = iniValue.Format(p.PropertyType);
                object value = Convert.ChangeType(iniValue, p.PropertyType);
                p.SetValue(Value, value, null);
            }
            return Value;
        }

        /// <summary>
        /// 序列化保存
        /// </summary>
        /// <returns></returns>
        public bool Serialize<T>(T Value, string path)
        {
            Type tInfo = Value.GetType();
            string section = tInfo.Name;
            foreach (PropertyInfo p in tInfo.GetProperties())
            {
                string key = p.Name;
                object value = p.GetValue(Value, null);
                string v = value == null ? "" : value.ToString();

                IniWriteValue(path,section, key, v);
            }
            return true;
        }



        /// <summary>
        /// 删除ini文件下所有段落
        /// </summary>
        public void ClearAllSection(string path)
        {
            IniWriteValue (path,null, null, null);
        }

        /// <summary>
        /// 删除ini文件下personal段落下的所有键
        /// </summary>
        /// <param name="Section"></param>
        public void ClearSection(string path,string Section)
        {
            IniWriteValue(path,Section, null, null);
        }
        #endregion

        public short ReadINI(string tablename, string id, string Key ,ref string value)
        {
            short ret = 0;
            try
            {
                value = IniReadValue(tablename, id, Key);
            }
            catch (Exception ex)
            {
                ret = -1;
            }

            return ret;

        }

        public short WriteINI(string path, string Section, string Key, string Value)
        {

            short ret = 0;
            try
            {
                IniWriteValue( path,  Section,  Key,  Value);
            }
            catch (Exception ex)
            {

                ret = -1;
            }

            return ret;
        }

        public short Read<T>(string tablename, ref T Value)
        {
            short ret = 0;

            try
            {
                Deserialize<T>(ref Value, tablename);
            }
            catch (Exception ex)
            {

                ret = -1;
            }
            return ret;
        }

        short FileBase.Write<T>(string tableName, string id, T data)
        {
            short ret = 0;
            try
            {
                Serialize<T>(data, tableName);
            }
            catch (Exception ex)
            {
                ret = -1;
            }
            return ret;

        }
    }

2.XML文件

代码如下:

  class XMLHalper : IFileBase
    {        

        #region ***************XMLFileHelper***************

        /// <summary>
        /// 文件化XML序列化
        /// </summary>
        /// <param name="obj">对象</param>
        /// <param name="filename">文件路径</param>
        public static bool Save(object obj, string filename)
        {
            bool ret = false;
            FileStream fs = null;
            try
            {
                fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
                XmlSerializer serializer = new XmlSerializer(obj.GetType());
                serializer.Serialize(fs, obj);
                ret = true;
            }
            catch (Exception ex)
            {
                ret = false;
                throw ex;
            }
            finally
            {
                if (fs != null) fs.Close();
            }

            return ret;
        }

        /// <summary>
        /// 文件化XML反序列化
        /// </summary>
        /// <param name="type">对象类型</param>
        /// <param name="filename">文件路径</param>
        public static object Load(Type type, string filename=null)
        {
            FileStream fs = null;
            try
            {
                fs = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                XmlSerializer serializer = new XmlSerializer(type);
                return serializer.Deserialize(fs);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                if (fs != null) fs.Close();
            }
        }

        #endregion

        public short Write<T>(string tableName, string id, T data)
        {
            short ret = 0;

            try
            {
                if (!Save(data, tableName))
                {
                    ret = -1;
                } 
            }
            catch (Exception ex)
            {
                ret = -1;
            }
            return ret;
        }

        public short Read<T>(string tablename, ref T Value)
        {
            short ret = 0;
            try
            {

                object o = Load(Value.GetType(), tablename);
                Value = (T)Convert.ChangeType(o, Value.GetType());
            }
            catch (Exception ex)
            {
                ret = -1;
            }
            return ret;
        }



        public short WriteINI(string path, string Section, string Key, string Value)
        {
            throw new NotImplementedException();
        }

        public short ReadINI(string tablename, string id, string Key, ref string data)
        {
            throw new NotImplementedException();
        }
    }

2.Json文件

代码如下:

class JsonHalper : IFileBase
{

    public short Save<T>(string path, T data)
    {
        short ret = 0;
        try
        {
            var jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
            //Json.NET序列化
            string jsonData = JsonConvert.SerializeObject(data, Newtonsoft.Json.Formatting.Indented, jsonSetting);
            //保存数据
            File.WriteAllText(path, jsonData);
        }
        catch (Exception ex)
        {

            ret = -1;
        }
        return ret;
    }

    public short Load<T>(string path,ref T data)
    {
        short ret = 0;
        try
        {                
            //读取数据
            string jsonsting = File.ReadAllText(path);
            //反序列化
            data = JsonConvert.DeserializeObject<T>(jsonsting);//反序列化
        }
        catch (Exception ex)
        {
            ret = -1; 
        }
        return ret;
    }

    public short Load<T>(string path, ref List<T> data)
    {
        short ret = 0;
        try
        {
            //读取数据
            string jsonsting = File.ReadAllText(path);
            //反序列化
            data = JsonConvert.DeserializeObject<List<T>>(jsonsting);//反序列化
        }
        catch (Exception ex)
        {
            ret = -1;
        }
        return ret;
    }

    public short Read<T>(string tablename, ref T Value)
    {
        return Load<T>(tablename, ref Value);
    }

    public short Write<T>(string tableName, string id, T data)
    {
       return  Save<T>(tableName,data);
    }

    public short ReadINI(string tablename, string id, string Key, ref string data)
    {
        throw new NotImplementedException();
    }


    public short WriteINI(string path, string Section, string Key, string Value)
    {
        throw new NotImplementedException();
    }
}

总结

这样做是为了方便直接将类转存至文件,以及文件转换出类型,不足是部分数据类型如字典,不支持XML,INI直接序列化 需要自己做处理。

这样做添加新的文件操作类型时需要在添加修改

 public FileHelper(FileType fileType)
        {
            type = fileType;
            switch (fileType)
            {
                case FileType.INIFile:
                    file = new INIHalper();
                    break;
                case FileType.XMLFile:
                    file = new XMLHalper();
                    break;

                case FileType.JSONFile:
                    file = new JsonHalper();
                    break;

                default:
                    break;
            }
        }

可以换为构造函数直接传参的方式

public FileHelper(IFileBase fileType)
{
		file =fileType;
}
上一篇:51uwb 开源TDOA 科研pro版本配置说明


下一篇:huggingface预训练模型下载到本地如何使用和加载