作为开发人员,我应该如何使用 Windows Vista(和 Windows 7)中的特殊文件夹?
Posted
技术标签:
【中文标题】作为开发人员,我应该如何使用 Windows Vista(和 Windows 7)中的特殊文件夹?【英文标题】:As a developer, how should I use the special folders in Windows Vista (and Windows 7)? 【发布时间】:2010-12-06 01:53:46 【问题描述】:我应该在哪里保存与我的应用程序相关的数据?我应该在哪里保存配置文件?我应该在哪里保存临时文件?我应该在“文档”中进行吗? “应用程序数据”?等等……
将数据保存到磁盘的最佳做法是什么(我猜,特殊文件夹的最佳做法?!)?
【问题讨论】:
【参考方案1】:ApplicationData:您的应用程序需要作为“每用户”数据且不属于其他类别的所有内容。标准配置文件会放在这里。
CommonApplicationData:所有非“每用户”数据。
LocalApplicationData:每个用户的非漫游数据。例如,您希望确保它仅存储在这台机器上的所有内容(如机器激活码,通常还有缓存/临时数据)。标准的临时文件会放在这里。
MyDocuments:用户实际会识别为“可识别的单个文档”的用户数据。
如果你不关心文件名,你也可以使用 tempfile API 在temp
目录中生成一个临时文件。您不应该手动执行此操作。例如,在.NET 中,您可以为此目的使用Path.GetTempFileName()
。
【讨论】:
+1 以获得有用的答案,特别是关于“每个用户”的区别。但我不清楚粗体字的名称是什么......文件夹的字面名称?不……图书馆? .NET 用来引用文件夹的某种抽象? @LarsH:“但我不清楚粗体的名称是什么......” 它们是 .Net Environment.SpecialFolder 枚举常量 - 尝试单击它们。 :-)【参考方案2】:来自Windows 7 Client Software Logo Program:
默认情况下应将应用程序安装到 Program Files 文件夹。由于安全权限,用户数据或应用程序数据绝不能存储在此位置 %ProgramFiles% 用于原生 32 位和 64 位应用程序,%ProgramFiles(x86)% 用于在 x64 上运行的 32 位应用程序,分别覆盖彼此的数据和设置。 必须在计算机上的用户之间共享的所有应用程序数据都应存储在 ProgramData 中 特定用户专有且不与计算机的其他用户共享的所有应用程序数据必须存储在 Users\\AppData 切勿直接写入“Windows”目录和/或子目录。使用正确的方法安装文件,例如字体或驱动程序 在“每台机器”安装中,用户数据必须在首次运行时写入,而不是在安装期间写入。这是因为在安装时没有正确的用户位置来存储数据。应用程序在安装后尝试在机器级别修改默认关联行为将不成功。相反,必须在每个用户级别声明默认值,这样可以防止多个用户覆盖彼此的默认值。【讨论】:
【参考方案3】:AppData 应该是自动配置和配置文件,文档应该只是用户保存的文件。我会将在多个系统中可能有用的任何东西放在 AppData/Roaming 中,并将其他任何东西(特定于机器的)放在 AppData/Local 或 LocalLow 中。对于临时文件,请使用 Temp 目录。
【讨论】:
我同意。当我安装的应用程序创建目录和/或将文件存储在(我的)文档中时,我讨厌它。 你能根据 Environment.SpecialFolder 枚举来翻译你的答案吗? Environment.GetFolderPath(Environment.SpecialFolder.xxx)【参考方案4】:一般来说,Windows 的最佳做法是遵循适当的环境变量。您想要保留的配置数据应该放在 %APPDATA% 中,临时文件应该放在 %TEMP% 中。
这样做的好处是,如果 Windows 发生变化,不会造成严重破坏,并且尊重人们可能拥有的奇怪配置。
另外,我同意其他答案,即“文档”应仅用于用户创建的数据并且仅在提示之后。
【讨论】:
【参考方案5】:此外,您应该使用 SHGetFolderPath 或 SHGetKnownFolderPath(在 Vista+ 中)来获取路径。无论当前安装的版本或语言如何,这将为您提供当前系统上的正确位置。切勿对您正在使用的任何路径进行硬编码。
【讨论】:
以上是关于作为开发人员,我应该如何使用 Windows Vista(和 Windows 7)中的特殊文件夹?的主要内容,如果未能解决你的问题,请参考以下文章
Linux中查看日志文件的正确姿势,求你别tail走天下了!
为啥要使用托管(C# 和 .NET)或本机代码进行 Windows API 开发?