在Windows上为我的程序存储configuration文件和日志文件的最佳位置?

我需要为我的应用程序存储日志文件和configuration文件。 哪里是最好的地方来存储他们?

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

日志文件可能会被用户定期访问,所以%APPDATA%似乎有点难以达到。

%USERPROFILE%\My Documents下的目录是最好的吗? 它需要从2000年的所有版本的Windows工作。

如果您不使用ConfigurationManager来pipe理您的应用程序和用户设置,则应该是。 .NET框架中的configuration工具包是非常深思熟虑的,与之互操作的Visual Studio工具也是如此。

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

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

当然有些情况下你不会 – 例如,如果你想写文件到networking共享,这样你就可以轻松地远程访问它们。 有很多方法可以实现,但是其中大部分都是从创build包含共享文件夹path的应用程序设置开始的。 所有这些都涉及pipe理。

我有一些关于ConfigurationManager和VS工具的抱怨:需要更好的高级文档,以及VS生成的Settings类的更好的文档。 app.config文件在目标编译目录中变成应用程序configuration文件的机制是不透明的(以及所有最常见问题之一的来源:“连接string发生了什么事情?”)。 如果有创build没有默认值的设置的方法,我还没有find它。

对于应用程序设置 – 使用System.Environment.SpecialFolder.ApplicationData – 这是存储漫游configuration文件数据的位置,因此它允许您的用户login和使用域中的不同计算机。

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

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

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

说实话,%appdata%仍然是放置你的configuration文件和日志文件的最佳位置,因为它符合占位符来存储应用程序数据的目的。 它不应该很难访问,只需在资源pipe理器中写入%appdata%,然后直接转到%appdata%目录。

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

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

此外,在浏览Internet时,还有一个项目可编程设置对在CommonApplicationData创build的文件夹的写入访问, 允许对CommonApplicationData进行写入/修改访问

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

Windows 7将允许用户自定义他们使用的UACpopup窗口(期望一些高级用户阻止大部分popup窗口),如果用户永远不会批准此写入尝试,则您的应用将失败/冻结。

如果您使用适当的userprofile和appdatavariables,那么Win 2000,XP,Vista和Win7会将数据映射到适当的写友好文件夹,而没有UACpopup窗口。

您可以使用SHGetSpecialFolderPath:

 int MAX_PATH = 255; CString m_strMyPath; SHGetSpecialFolderPath(NULL, m_strMyPath.GetBuffer(MAX_PATH), CSIDL_COMMON_APPDATA, TRUE); 

这将指定您可以安全地将日志写入Windows的“特殊文件夹path”:

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

对于Vista: C:\ProgramData

在这里检查MSDN页面: http : //msdn.microsoft.com/en-us/library/bb762204(VS.85).aspx

最好的答案取决于日志和configuration的性质。 如果它们是程序范围的,并且不需要在应用程序的卸载之后继续存在,那么我认为它们在那里是很好的。 如果日志和configuration是用户特定的,或者需要在卸载后仍然存在,那么它们属于%USERPROFILE% – %APPDATA%作为这种types的适当的基本目录。

我使用隔离存储进行configuration。 您也可以使用Temp文件夹来存储日志等临时信息。