在我的程序中,在Windows上存储配置文件和日志文件的最佳位置?

时间:2008-11-06 19:08:31

标签: c# windows

我需要为我的应用程序存储日志文件和配置文件。存放它们的最佳位置在哪里?

现在,我只是使用当前目录,最终将它们放在我的程序所在的Program Files目录中。

用户可能会定期访问日志文件,因此%APPDATA%似乎有点难以实现。

%USERPROFILE%\My Documents下的目录最好吗?从2000年开始,它需要适用于所有版本的Windows。

9 个答案:

答案 0 :(得分:31)

如果您没有使用ConfigurationManager来管理您的应用和用户设置,那么您应该这样做。 .NET Framework中的配置工具包经过深思熟虑,并且与其互操作的Visual Studio工具也是如此。

ConfigurationManager的默认行为将不变(应用程序)和可修改(用户)设置放在正确的位置:应用程序设置进入应用程序文件夹,用户设置进入System.Environment.SpecialFolder.LocalApplicationData。它在支持.NET的所有Windows版本下都能正常运行。

对于日志文件,System.Environment.SpecialFolder.LocalApplicationData通常是您想要放置它们的地方,因为它保证是用户可写的。

在某些情况下,您肯定不会 - 例如,如果您想将文件写入网络共享,以便您可以轻松地远程访问它们。有很多种方法可以实现,但大多数方法都是从创建包含共享文件夹路径的应用程序设置开始的。所有这些都涉及管理。

我有一些关于ConfigurationManager和VS工具的抱怨:需要更好的高级文档,以及更好的VS生成的Settings类文档。 app.config文件转换为目标构建目录中的应用程序配置文件的机制是不透明的(并且是所有问题中最常见问题之一的来源:“我的连接字符串发生了什么?”)。如果有一种方法可以创建没有默认值的设置,我还没有找到它。

答案 1 :(得分:9)

注意:您可以使用以下函数获取.NET中LocalApplicationData文件夹的路径:

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

答案 2 :(得分:8)

对于应用程序设置 - 使用System.Environment.SpecialFolder.ApplicationData - 这是存储漫游配置文件数据的位置,因此它允许您的用户从域中的不同计算机进行登录和工作。

对于日志文件 - System.Environment.SpecialFolder.LocalApplicationData

答案 3 :(得分:6)

说实话,%appdata%仍然是放置配置文件和日志文件的最佳位置,因为它用于存储应用程序数据的占位符。它应该不难访问,只需在资源管理器中编写%appdata%,您就可以直接进入%appdata%目录。

答案 4 :(得分:5)

接受的答案指出,对于日志文件,以下是一个好地方。 System.Environment.SpecialFolder.LocalApplicationData这相当于C:\Users\[User]\AppData\Roaming的路径,您可以看到该路径是特定于用户的。与接受的答案一样,提到这是一个有保证的用户可写位置,对某些情况很有用

但是,在Web应用程序环境中,您可能正在网络帐户下运行应用程序,而您或同事可能需要尝试跟踪每个应用程序的日志记录。我个人喜欢使用非用户特定的位置枚举 System.Environment.SpecialFolder.CommonApplicationData等同于C:\ProgramData。是的,您需要为您创建的任何文件夹指定访问权限,但这通常是一次性交易,然后您的所有应用程序日志都可以存在于一个快乐的位置。

此外,在环顾互联网时,有一个项目以编程方式设置您在CommonApplicationData Allow write/modify access to CommonApplicationData 中创建的文件夹的写入权限。

答案 5 :(得分:4)

不要将配置文件存储在应用程序文件夹中,Microsoft已声明这不是理想的位置。 Windows一直在阻止写入C:\ Program Files \,你会发现在Vista中任何试图写在这里的应用程序都会发出UAC警告。

Windows 7将允许用户自定义他们使用的UAC弹出窗口(期望一些高级用户阻止他们中的大多数),如果用户从未批准此写入尝试,您的应用将会失败/冻结。

如果你使用正确的userprofile和appdata变量,那么Win 2000,XP,Vista和Win7会将数据映射到正确的写友好文件夹,没有UAC弹出窗口。

答案 6 :(得分:2)

您可以使用SHGetSpecialFolderPath:

int MAX_PATH = 255;

CString m_strMyPath;

SHGetSpecialFolderPath(NULL, m_strMyPath.GetBuffer(MAX_PATH), CSIDL_COMMON_APPDATA, TRUE);

这将指定“特殊文件夹路径”,您可以安全地为Windows写入日志:

对于XP:C:\Documents and Settings\All Users\Application Data

对于Vista:C:\ProgramData

在此处查看MSDN页面:http://msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx

答案 7 :(得分:1)

最佳答案取决于日志和配置的性质。如果它们是程序范围的,并且不需要在应用程序的卸载后继续存在,那么我认为它们很好。如果日志和配置是特定于用户的,或者需要在卸载后继续存在,那么它们属于%USERPROFILE% - %APPDATA%,是此类事物的“正确”基本目录。

答案 8 :(得分:0)

我使用隔离存储进行配置。您还可以使用 Temp 文件夹存储临时信息,例如日志。