2012-02-21 253 views
0

我在c#中使用WritePrivateProfileString(通过DllImport)来存储从接口上的文本框取得的路径。和.ini文件名是在我的应用使用WritePrivateProfileString编写路径问题

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

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

回答

1

我猜想有些东西正在改变你的过程的工作目录,很可能是你的过程中的代码。需要注意的是documentation有这样一段话:

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

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

说了这么多,不管问题的原因是什么,您都应该使用完全限定的路径,以确保文件写在希望写入的地方。无论何时您希望文件进入特定的目录,通过使用完全限定的路径来强制执行该操作总是最容易的。

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

还有一点需要指出,与可执行文件相同的目录可能是不好的选择。如果您的程序安装在Program Files目录下,那么包含可执行文件的目录通常不会被写入。我认为你应该考虑使用用户配置文件下的一个目录。查找Environment.SpecialFolder值之一。

+0

谢谢。这解决了它。下次会注意类似的问题:) – moyoma 2012-02-21 15:49:24

1

继大卫·赫弗南的答案 - 您可以使用

Path.GetDirectoryName(Application.ExecutablePath); 

安全得到公正运行的应用程序的文件夹中的一部分。

如果你在一个dll,而不是一个可执行的时候,你可以使用

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

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

0

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

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

你通常没有权限写入到Program Files文件夹等