C#C++获取当前应用程序的安装目录和工作目录

很多时候,用户自己点击打开read.exe加载的时候都没有问题,读取ini配置文件也没有问题。但是如果应用程序是开机启动呢?32位Windows系统当前目录是C盘的windows\system32;而64位系统软件启动后默认的当前目录是:C:\Windows\SysWOW64,这个时候如果系统中不存在ini文件,就会报错找不到了。

C#代码:

string databasePath = Environment.CurrentDirectory + "\\DXConfig.ini"; //程序工作目录,工作目录是应用程序启动的目录,例如开机启动程序调用read.exe,则是系统的32或者64目录。
string databasePath = Application.StartupPath + "\\DXConfig.ini";//应用程序的安装目录

///////////////////////////////////////////C# 读取config.ini里面内容///////////////////////////////////////////

string filePath = Application.StartupPath + "\\DXXconfig.ini";
string IsReadIDCard = "";
string IsReadSSCard = "";

IsReadIDCard = INIHelper.ReadFromINI(filePath, "Config", "IsReadIDCard").Replace(" ", "");
IsReadSSCard = INIHelper.ReadFromINI(filePath, "Config", "IsReadSSCard").Replace(" ", "");

//写INI文件:
INIHelper.WriteToINI(filePath, "Config", "IsReadIDCard", "true"); 


#region 读写ini配置文件

/// <summary>
/// 对INI文件进行读写
/// </summary>
class INIHelper
{
    /// <summary>
    /// 从INI文件中读取数据
    /// </summary>
    /// <param name="filePath">INI文件的全路径</param>
    /// <param name="rootValue">根节点值,例如根节点[ConnectString]的值为:ConnectString</param>
    /// <param name="key">根节点下的键</param>
    /// <param name="defValue">当标记值未设定或不存在时的默认值</param>
    /// <returns></returns>
    public static string ReadFromINI(string filePath, string rootValue, string key, string defValue = "")
    {
        //StringBuilder sb = new StringBuilder(1024);
        //GetPrivateProfileString(rootValue, key, defValue, sb, 1024, filePath);
        //return sb.ToString();

        //改成支持中文ini配置
        byte[] retVal = new byte[255];
        int i = GetPrivateProfileString(rootValue, key, defValue, retVal, 1024, filePath);
        string s = Encoding.UTF8.GetString(retVal, 0, i);
        return s.ToString();
    }
    public static void WriteToINI(string filePath, string rootValue, string key, string newVal)
    {

        WritePrivateProfileString(rootValue, key, newVal, filePath);

    }

    /// <summary>
    /// 对INI文件进行读取操作
    /// </summary>
    /// <param name="IpAppName">表示INI文件内部根节点的值</param>
    /// <param name="IpKeyName">表示根节点下子标记的值</param>
    /// <param name="IpDefault">表示当标记值未设定或不存在时的默认值</param>
    /// <param name="IpReturnString">返回读取节点的值</param>
    /// <param name="nSize">读取的节点内容的最大容量</param>
    /// <param name="IpFileName">文件的全路径</param>
    /// <returns></returns>
    [System.Runtime.InteropServices.DllImport("kernel32")]
    //static extern int GetPrivateProfileString(string IpAppName, string IpKeyName, string IpDefault, StringBuilder IpReturnString, int nSize, string IpFileName);  //不支持中文,中文会乱码
    static extern int GetPrivateProfileString(string IpAppName, string IpKeyName, string IpDefault, byte[] retVal, int nSize, string IpFileName);//改成支持中文ini配置

    /// <summary>
    /// 对INI文件进行写入操作
    /// </summary>
    /// <param name="mpAppName">INI文件内部根节点的值</param>
    /// <param name="mpKeyName">将要修改的标记名称</param>
    /// <param name="mpDefault">想要修改的内容</param>
    /// <param name="mpFileName">INI文件的全路径</param>
    /// <returns></returns>
    [System.Runtime.InteropServices.DllImport("kernel32")]
    static extern long WritePrivateProfileString(string mpAppName, string mpKeyName, string mpDefault, string mpFileName);
}
#endregion

C++代码:
    TCHAR  NowPath[MAX_PATH];
    if (!GetModuleFileName(NULL, NowPath, MAX_PATH))//获取exe可执行文件的绝对路径
    {
        MessageBox(NULL, "GetModuleFileName failed", "报错", MB_OK);
        //printf("GetModuleFileName failed (%d)\n", GetLastError());
        return  FALSE;
    }
    PathRemoveFileSpec(NowPath);//将路径末尾的文件名和反斜杠去掉
    SetCurrentDirectory(NowPath);//设置当前应用程序新当前目录的路径
    char NowPaths[512] = "";
    strcat(NowPaths, NowPath);
    strcat(NowPaths, "\\DXConfig.ini");

///////////////////////////////////////////C++ 读取config.ini里面内容///////////////////////////////////////////

string url_hb = "";

TCHAR  NowPath[MAX_PATH];
if (!GetModuleFileName(NULL, NowPath, MAX_PATH))//获取exe可执行文件的绝对路径
{
    MessageBox(NULL, "GetModuleFileName failed", "报错", MB_OK);
    //printf("GetModuleFileName failed (%d)\n", GetLastError());
    return  FALSE;
}
PathRemoveFileSpec(NowPath);//将路径末尾的文件名和反斜杠去掉
SetCurrentDirectory(NowPath);//设置当前应用程序新当前目录的路径
char NowPaths[512] = "";
strcat(NowPaths, NowPath);
strcat(NowPaths, "\\DXConfig.ini");
LPTSTR Lp_Path = new char[MAX_PATH];
strcpy(Lp_Path, NowPaths);

LPTSTR Lp_url_hb = new char[48];
LPTSTR Lp_url_nbrz = new char[48];

GetPrivateProfileString("URLConfig", "url_hb", "", Lp_url_hb, 48, Lp_Path);
url_hb = Lp_url_hb;
delete[] Lp_Path;


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值