【发布时间】:2008-11-06 19:08:30
【问题描述】:
我需要为我的应用程序存储日志文件和配置文件。存放它们的最佳地点在哪里?
现在,我只是使用当前目录,最终将它们放在我的程序所在的 Program Files 目录中。
用户可能会定期访问日志文件,因此%APPDATA% 似乎有点难以找到。
%USERPROFILE%\My Documents下的目录是不是最好?它需要适用于从 2000 年开始的所有 Windows 版本。
【问题讨论】:
我需要为我的应用程序存储日志文件和配置文件。存放它们的最佳地点在哪里?
现在,我只是使用当前目录,最终将它们放在我的程序所在的 Program Files 目录中。
用户可能会定期访问日志文件,因此%APPDATA% 似乎有点难以找到。
%USERPROFILE%\My Documents下的目录是不是最好?它需要适用于从 2000 年开始的所有 Windows 版本。
【问题讨论】:
如果您没有使用ConfigurationManager 来管理您的应用程序和用户设置,那么您应该使用。 .NET Framework 中的配置工具包经过深思熟虑,与之互操作的 Visual Studio 工具也是如此。
ConfigurationManager 的默认行为将不变(应用程序)和可修改(用户)设置放在正确的位置:应用程序设置放在应用程序文件夹中,用户设置放在 System.Environment.SpecialFolder.LocalApplicationData 中。它在所有支持 .NET 的 Windows 版本下都能正常工作。
对于日志文件,System.Environment.SpecialFolder.LocalApplicationData 通常是您要放置它们的位置,因为它保证用户可写。
在某些情况下您肯定不会 - 例如,如果您想将文件写入网络共享以便您可以轻松地远程访问它们。有很多方法可以实现这一点,但其中大多数都是从创建包含共享文件夹路径的应用程序设置开始的。所有这些都涉及管理。
我对 ConfigurationManager 和 VS 工具有一些抱怨:需要比现有更好的高级文档,以及更好的 VS 生成的 Settings 类的文档。 app.config 文件转换为目标构建目录中的应用程序配置文件的机制是不透明的(以及最常见问题之一的来源:“我的连接字符串发生了什么事?”)。如果有一种方法可以创建没有默认值的设置,我还没有找到。
【讨论】:
注意:您可以使用以下函数获取 .NET 中 LocalApplicationData 文件夹的路径:
string strPath=System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);
【讨论】:
对于应用程序设置 - 使用 System.Environment.SpecialFolder.ApplicationData - 这是存储漫游配置文件数据的位置,因此它允许您的用户在域中的不同机器上登录和工作。
对于日志文件 - System.Environment.SpecialFolder.LocalApplicationData
【讨论】:
接受的答案指出,对于日志文件,以下是一个好地方。
System.Environment.SpecialFolder.LocalApplicationData 这相当于C:\Users\[User]\AppData\Roaming 的路径,您可以看到它是用户特定的。就像接受的答案提到的那样,这是一个保证用户可写的位置,在某些情况下可能很有用
但是,在 Web 应用程序环境中,您可能会在网络帐户下运行应用程序,并且您或同事可能需要尝试跟踪每个应用程序的这些日志的确切位置。我个人喜欢使用非用户特定的位置枚举
System.Environment.SpecialFolder.CommonApplicationData 等同于 C:\ProgramData。是的,您需要为您创建的任何文件夹指定访问权限,但这通常是一次性交易,然后您的所有应用程序日志都可以保存在一个满意的位置。
此外,在浏览 Internet 时,有一个项目可以以编程方式设置对您在 CommonApplicationData、Allow write/modify access to CommonApplicationData 中创建的文件夹的写入权限。
【讨论】:
老实说,%appdata% 仍然是放置配置文件和日志文件的最佳位置,因为它充当占位符来存储应用程序数据。它应该不难访问,只需在资源管理器中写入 %appdata% 即可,您将被直接定向到您的 %appdata% 目录。
【讨论】:
不要将配置文件存储在应用程序文件夹中,Microsoft 已声明这不是理想的位置。 Windows 一直在朝着阻止写入 C:\Program Files\ 的方向发展,您会在 Vista 中发现任何尝试在此处写入的应用程序都会触发 UAC 警告。
Windows 7 将允许用户自定义他们使用的 UAC 弹出窗口(预计某些高级用户会阻止其中的大部分),如果用户从未批准此写入尝试,您的应用将失败/冻结。
如果您使用正确的 userprofile 和 appdata 变量,那么 Win 2000、XP、Vista 和 Win7 会将数据映射到正确的写友好文件夹,不会弹出 UAC。
【讨论】:
你可以使用 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
【讨论】:
最佳答案取决于日志和配置的性质。如果它们是程序范围的,并且不需要在应用程序卸载后幸存下来,那么我认为它们在它们所在的位置很好。如果日志和配置是用户特定的,或者需要在卸载后继续存在,那么它们属于 %USERPROFILE% - %APPDATA% 是此类事物的“正确”基本目录。
【讨论】:
我使用隔离存储进行配置。您还可以使用 Temp 文件夹来存储日志等临时信息。
【讨论】: