使用WritePrivateProfileString写入路径问题

本文关键字:路径 问题 WritePrivateProfileString 使用 | 更新日期: 2023-09-27 18:25:30

我在c#中使用WritePrivateProfileString(通过DllImport)来存储从接口上的文本框获取的路径。.ini文件名是在我的应用程序中硬编码的

string ini_file = ".''config.ini";

但是,当文件写入时,配置文件会写入从接口获取的第一个路径,而不是写入exe目录。这很奇怪。调试显示,值被正确地发送到WritePrivateProfileString,但它仍然被写入错误的位置。有人知道为什么会发生这种事吗?

使用WritePrivateProfileString写入路径问题

我猜有什么东西正在更改进程的工作目录,很可能是进程中的代码。请注意,文档中有这样的内容:

如果lpFileName参数不包含文件的完整路径和文件名,WritePrivateProfileString将在Windows目录中搜索该文件。如果该文件不存在,此函数将在Windows目录中创建该文件。

现在我的猜测是,如果你只提供一个文件名,这就适用了。因为您的文件名以.开头,我相信这将强制函数从当前工作目录启动。

说了这么多,不管问题的原因是什么,都应该使用一个完全限定的路径,以确保文件写入到您希望写入的位置。每当您希望文件进入特定目录时,通过使用完全限定路径来强制执行总是最简单的。

您可以使用Application.ExecutablePath找到可执行文件的路径,然后删除文件名部分。

另一点是,与可执行文件相同的目录可能是一个糟糕的选择。如果您的程序安装在program Files目录下,那么包含可执行文件的目录通常是不可写的。我认为您应该考虑在用户配置文件中使用下的目录。查找其中一个Environment.SpecialFolder值。

根据David Heffernan的回答,您可以使用

Path.GetDirectoryName(Application.ExecutablePath);

只安全地获取正在运行的应用程序的文件夹部分。

如果你在dll而不是可执行文件中,你可以使用

Path.GetDirectoryName(Assembly.GetAssembly(typeof(MyClass)).CodeBase);

两者都需要System.IO,并且最初发布在此处。第二个例子也需要System.Reflection)。

应用程序数据文件应该写入LocalApplicationData特殊文件夹。

string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);

您通常没有权限写入Program Files文件夹等。