以下是读ini文件的类
using System; 
using System.IO; 
using System.Runtime.InteropServices; 
using System.Text; 
namespace Sx_Mdi 
{ /// <summary> 
/// Summary description for Class1. 
/// </summary> 
public class IniFile 

//文件INI名称 
public string Path; ////声明读写INI文件的API函数 
[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); 
//类的构造函数,传递INI文件名 
public IniFile(string inipath) 

// 
// TODO: Add constructor logic here 
// 
Path = inipath; 
} //写INI文件 
public void IniWriteValue(string Section,string Key,string Value) 

WritePrivateProfileString(Section,Key,Value,this.Path); } //读取INI文件指定 
public string IniReadValue(string Section,string Key) 

StringBuilder temp = new StringBuilder(255); 
int i = GetPrivateProfileString(Section,Key,"",temp,255,this.Path); 
return temp.ToString(); }


以下是用到类的地方
 public static string GetPath()
        {
            string strpath = System.Windows.Forms.Application.StartupPath+"\\out.ini";
            return strpath;
        }
        public static string MyDatainfo()
        {
            string sPath;
            string ServerName, userId, sPwd, DataName;            sPath = GetPath();
            IniFile ini = new IniFile(sPath);
            ServerName = ini.IniReadValue("Database", "server");
            userId = ini.IniReadValue("Database", "uid");
            sPwd = ini.IniReadValue("Database", "pwd");
            DataName = ini.IniReadValue("Database", "database");
            string strSql = "server =" + ServerName + ";uid =" + userId + ";pwd =" + sPwd + ";database =" + DataName;
            return strSql;
        } 
ini文件里就有
[Database] 
server=localhost
database=outlook
uid=root
pwd=''点破东西结果MyDatainfo()
里那四个变量都是空的
咋搞的呢?

解决方案 »

  1.   

    int i = GetPrivateProfileString(Section,Key,"",temp,255,this.Path); WritePrivateProfileString(Section,Key,Value,this.Path); 为什么不判断下是否成功呢???平台调用时一定要判断是否调用成功!
      

  2.   

    先做一个写ini文件的,用程序生成一个ini文件,然后再去读。不要自己弄。
      

  3.   

    [DllImport("kernel32")] private static extern int GetPrivateProfileString(string section,string key,string def,StringBuilder retVal,int size,string filePath);StringBuilder retVal <-- StringBuilder ? 没见过这用法
      

  4.   

    既然都C#了 为何还ini 弃xml于不顾?
      

  5.   

    用xml也可以。我就是不明白为什么不能读取呢。没看出来那里错了。
    我  把  255 改成  1024试一下
    StringBuilder temp = new StringBuilder(1024); 
    int i = GetPrivateProfileString(Section,Key,"error",temp,1024,this.Path); 
      

  6.   

    先做一个写ini文件的,用程序生成一个ini文件,然后再去读。不要自己弄。
      

  7.   

    public string inipath;
     [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);
     public INIClass(string INIPath)
     {
      inipath = INIPath;
     }
     public void IniWriteValue(string Section,string Key,string Value)
     {
      WritePrivateProfileString(Section,Key,Value,this.inipath);
     }
     public string IniReadValue(string Section,string Key)
     {
      StringBuilder temp = new StringBuilder(500);
      int i = GetPrivateProfileString(Section,Key,"",temp,500,this.inipath);
      return temp.ToString();
     }
     public bool ExistINIFile()
     {
      return File.Exists(inipath);
     }
    http://topic.csdn.net/u/20090406/12/90712efe-bd44-49bc-9a2a-b0d1790cbb6c.html
      

  8.   

    从逻辑上没找出错,有一种可能:楼主,仔细查一下,INI文件是保存在这个位置下吗?
     很可能不是啊.解决读写INI文件,写到静态类中,不用实例化,一层方法就能解决问题。
    这样比较简洁,可读性、可维护要好。
    public static class IniFile
    {
        //声明读写INI文件的API函数 
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);
        [DllImport("kernel32")]
        public static extern long WritePrivateProfileString(string section, string key, string val, string filePath);    static string path = Application.StartupPath + "\\out1.ini";
        //读 INI
        public static string GetSqlString()
        {
            if (System.IO.File.Exists(path) == false) return "";        StringBuilder temp1 = new StringBuilder(255);
            StringBuilder temp2 = new StringBuilder(255);
            StringBuilder temp3 = new StringBuilder(255);
            StringBuilder temp4 = new StringBuilder(255);        int i1 = GetPrivateProfileString("Database", "server", "", temp1, 255, path);
            int i2 = GetPrivateProfileString("Database", "uid", "", temp2, 255, path);
            int i3 = GetPrivateProfileString("Database", "pwd", "", temp3, 255, path);
            int i4 = GetPrivateProfileString("Database", "database", "", temp4, 255, path);        StringBuilder strSql = new StringBuilder(255);
            strSql.Append("server =" + temp1.ToString().Trim());
            strSql.Append(";uid = " + temp2.ToString().Trim());
            strSql.Append(";pwd =" + temp3.ToString().Trim());
            strSql.Append(";database =" + temp4.ToString().Trim());
            
            return strSql.ToString();
        }    // 写 INI
        public static void WriteIni(string server, string uid, string pwd, string database)
        {
            WritePrivateProfileString("Database", "server", server, path);
            WritePrivateProfileString("Database", "uid", uid, path);
            WritePrivateProfileString("Database", "pwd", pwd, path);
            WritePrivateProfileString("Database", "database", database, path);
        }

      

  9.   

    谢谢大家的回复,其实我用ini就是因为生成可执行安装文件在公司另一个地方可以用,那儿的数据库用户名和密码等不知道是什么,为了方便修改才用ini的,有什么别的办法能解决这个问题也可以
      

  10.   

    强烈建议楼主用xml格式存储,通过序列化的方式读取。具体如下
    声明一个你的数据库信息的类
    public class MyDatabaseInfo
    {
        public string server;
        public string database;
        public string uid;
        public string pwd; }在程序中声明一个实例
        MyDatabaseInfo dbInfo = new MyDatabaseInfo();
        dbInfo.server = "....";
        dbInfo.database= "....";
        dbInfo.uid = "....";
        dbInfo.pwd = "....";    //把对象dbInfo保存到xml中
            public void SaveToXml(string path, MyDatabaseInfo dbInfo)
            {
                XmlSerializer xs = new XmlSerializer(typeof(MyDatabaseInfo));
                FileStream fs = new FileStream(path, FileMode.Create, FileAccess.ReadWrite);
                xs.Serialize(fs, dbInfo);
                fs.Close();
            }
        //把对象从xml中读出来
            public MyDatabaseInfo ReadFromXml(string path)
            {
                XmlSerializer xs = new XmlSerializer(typeof(MyDatabaseInfo));
                FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);
                MyDatabaseInfo dbInfo = (MyDatabaseInfo)xs.Deserialize(fs);
                fs.Close();
                return dbInfo;
            }具体的根据需要你在整理下。
      

  11.   

    在类里加上一个方法。
    /// <summary>
     /// 验证文件是否存在
     /// </summary>
     /// <returns>布尔值</returns>
     public bool ExistINIFile()
     {
      return File.Exists(inipath);
     }然后在这里使用,看看文件存在吗。
    public static string MyDatainfo()
            {
                string sPath;
                string ServerName, userId, sPwd, DataName;            sPath = GetPath();
                IniFile ini = new IniFile(sPath);
                if (ini.ExistINIFile())
    {
                ServerName = ini.IniReadValue("Database", "server");
                userId = ini.IniReadValue("Database", "uid");
                sPwd = ini.IniReadValue("Database", "pwd");
                DataName = ini.IniReadValue("Database", "database");
                string strSql = "server =" + ServerName + ";uid =" + userId + ";pwd =" + sPwd + ";database =" + DataName;
                return strSql;
    }
            } 
      

  12.   

    开始是我用txt文件修改的,我发现文件是out.ini.txt这样的,我读的时候判断文件不存在,修改后判断文件是存在了,但是读出来的信息还是空的,不知道怎么回事