使用WritePrivateProfileString写入路径问题

时间:2012-02-21 14:53:20

标签: c# path dllimport ini

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

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

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

3 个答案:

答案 0 :(得分:1)

我猜想有些东西正在改变你的进程的工作目录,很可能是你进程中的代码。请注意,documentation可以这样说:

  

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

现在我的猜测是,如果您只提供文件名,则适用。因为您的文件名以.开头,我相信会强制该函数从当前工作目录开始。

说完所有这些,无论问题的原因是什么,都应该使用完全限定的路径,以确保将文件写入您希望写入的位置。每当您希望文件进入特定目录时,通过使用完全限定路径强制执行此操作始终是最容易的。

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

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

答案 1 :(得分:1)

继David Heffernan的回答 - 你可以使用

Path.GetDirectoryName(Application.ExecutablePath);

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

如果您使用的是dll而不是可执行文件,则可以使用

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

两者都需要System.IO,最初发布here。第二个例子也需要System.Reflection)。

答案 2 :(得分:0)

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

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

您通常无权写入Program Files文件夹等。