我可以将 Ini 文件存储在资源文件中吗?
Can I store an Ini file in a Resources file?
我有一个 Windows Forms 应用程序,.Net Framework 4.6.1,我想将一些数据库连接数据存储在一个 Ini 文件中。
然后我想将它存储在项目的资源文件中(这样我就不必手动 copy/paste Debug 和 Release 文件夹中的文件等)作为普通文件,但是当我尝试编译程序并使用 ini-parser 读取 Ini 数据时,出现以下异常:System.ArgumentException: 'Invalid characters in path access'
.
我使用的是Properties.Resources
读取Ini文件的地方,所以我猜路径应该没有问题。会不会是ini文件本身的问题?
Ini文件内容如下:
[Db]
host = (anIP)
port = (aPort)
db = (aDbName)
user = (aDbUser)
password = (aDbUserPwd)
以及我读取数据的方法:
public static void ParseIniData()
{
var parser = new FileIniDataParser();
IniData data = parser.ReadFile(Properties.Resources.dbc);
mysqlHost = data["Db"]["host"];
mysqlPort = data["Db"]["port"];
mysqlDb = data["Db"]["db"];
mysqlUser = data["Db"]["user"];
mysqlPwd = data["Db"]["password"];
}
我终于可以使用@KlausGütter 在评论中告诉我的内容来做到这一点(谢谢!)。
您必须使用 StreamIniDataParser
而不是使用 FileIniDataParser
,并使用 Assembly.GetManifestResourceStream
获取流。
我发现这有点棘手,因为使用这种方法需要将要读取的文件中的Build Action
设置为Embedded Resource
。
然后在编译时将此文件添加为嵌入式资源,您可以检索其流。
所以我的方法是这样结束的:
public static void ParseIniData()
{
var parser = new StreamIniDataParser();
dbcReader = new StreamReader(_Assembly.GetManifestResourceStream("NewsEditor.Resources.dbc.ini"));
IniData data = parser.ReadData(dbcReader);
mysqlHost = data["Db"]["host"];
mysqlPort = data["Db"]["port"];
mysqlDb = data["Db"]["db"];
mysqlUser = data["Db"]["user"];
mysqlPwd = data["Db"]["password"];
}
其中 _Assembly
是私有静态属性:private static Assembly _Assembly = Assembly.GetExecutingAssembly();
。这会让你得到当 运行 代码时正在执行的程序集(你也可以直接在方法中使用这段代码,但我在 class 中的另一个方法上使用了程序集,所以我决定设置一个属性...我猜是干的)。
我有一个 Windows Forms 应用程序,.Net Framework 4.6.1,我想将一些数据库连接数据存储在一个 Ini 文件中。
然后我想将它存储在项目的资源文件中(这样我就不必手动 copy/paste Debug 和 Release 文件夹中的文件等)作为普通文件,但是当我尝试编译程序并使用 ini-parser 读取 Ini 数据时,出现以下异常:System.ArgumentException: 'Invalid characters in path access'
.
我使用的是Properties.Resources
读取Ini文件的地方,所以我猜路径应该没有问题。会不会是ini文件本身的问题?
Ini文件内容如下:
[Db]
host = (anIP)
port = (aPort)
db = (aDbName)
user = (aDbUser)
password = (aDbUserPwd)
以及我读取数据的方法:
public static void ParseIniData()
{
var parser = new FileIniDataParser();
IniData data = parser.ReadFile(Properties.Resources.dbc);
mysqlHost = data["Db"]["host"];
mysqlPort = data["Db"]["port"];
mysqlDb = data["Db"]["db"];
mysqlUser = data["Db"]["user"];
mysqlPwd = data["Db"]["password"];
}
我终于可以使用@KlausGütter 在评论中告诉我的内容来做到这一点(谢谢!)。
您必须使用 StreamIniDataParser
而不是使用 FileIniDataParser
,并使用 Assembly.GetManifestResourceStream
获取流。
我发现这有点棘手,因为使用这种方法需要将要读取的文件中的Build Action
设置为Embedded Resource
。
然后在编译时将此文件添加为嵌入式资源,您可以检索其流。
所以我的方法是这样结束的:
public static void ParseIniData()
{
var parser = new StreamIniDataParser();
dbcReader = new StreamReader(_Assembly.GetManifestResourceStream("NewsEditor.Resources.dbc.ini"));
IniData data = parser.ReadData(dbcReader);
mysqlHost = data["Db"]["host"];
mysqlPort = data["Db"]["port"];
mysqlDb = data["Db"]["db"];
mysqlUser = data["Db"]["user"];
mysqlPwd = data["Db"]["password"];
}
其中 _Assembly
是私有静态属性:private static Assembly _Assembly = Assembly.GetExecutingAssembly();
。这会让你得到当 运行 代码时正在执行的程序集(你也可以直接在方法中使用这段代码,但我在 class 中的另一个方法上使用了程序集,所以我决定设置一个属性...我猜是干的)。