在某处写日志和数据的正确方法

时间:2017-03-08 10:33:49

标签: c# windows

我们有一个Windows应用程序,可以安装在程序文件中,也可以从其他地方复制和使用。此外,客户经常希望在同一台机器上使用多个版本的应用程序(长话短说:客户有N个项目,每个项目处于不同的阶段,因此每个项目都需要不同版本的应用程序。客户基于它自己的项目在顶部我们的申请/框架)。

我们开始看到客户抱怨运行我们的应用程序需要管理员权限,因为:

  • 我们将文本日志写入本地文件夹。我们也使用Windows事件作为日志,但需要文本日志。
  • 我们将DB缓存写入本地文件夹。数据库缓存应尽可能在应用程序运行之间保持不变。
  • 我们还会编写一些其他文件,例如仅在应用运行生命周期内需要的固件,并且可以在应用程序关闭时删除。

我们决定我们应该为此做些什么。可能我们应该把所有这些东西都写到%AppData%/[someFolder]。问题是客户可能有几个不同的应用实例,他们应该有单独的日志/缓存。客户甚至可能安装了两次相同的版本,因此我们无法将版本用作密钥。

目前的想法是使用Assembly.GetEntryAssembly().Location作为键,因此写入的路径将类似于$"%AppData%\{Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)}"。这可能会奏效,但看起来非常奇怪和黑客。

有没有更好的方法来管理它?我还考虑将每个应用实例发布为GUID并使用它,但我不确定如何正确地执行此操作。

2 个答案:

答案 0 :(得分:1)

我决定将我的评论写入答案,因为它们已经是某些人的想法(你似乎要做的事情)。

相对文件夹是一种更简单的解决方案,如果您同时安装了多个版本的软件,那么您不应该有冲突(假设它们都有不同的基本文件夹)或者混淆哪个女巫

C:\Company Name\Software Name 1.0
C:\Company Name\Software Name 1.1
C:\Company Name\Software Name 2.1
D:\Test\Blablabla

查找软件可执行文件和相应数据非常容易。我个人不喜欢AppData想法(作为开发人员和用户)主要是因为它引入的混乱,因为软件A可能会突然将其数据存储在

c:\Users\Current User\AppData\LocalOrLocalLowOrRoamingTryToGuessWhich\SomeWeirdFolderNameToExampleB

通常,安装人员需要检查Windows版本,检查文件夹权限等,以确保应用程序具有正确的环境,但软件也可以在启动时执行此操作,以便在条件允许时至少发出警告没有成功运行。

在我们公司的软件安装程序中,默认情况下会提供C:\Company Name\Software Name Version文件夹,这对我们的客户来说没问题。

如果你必须使用Program Files(因为,这也不错),那么,例如Steam客户端将执行某些操作以使其Program Files内的文件夹可写。

答案 1 :(得分:1)

写入c:\Program FilesC:\Company Name都不是好主意,也不符合Windows最佳做法。写入程序文件需要管理员权限才有原因!写入C:\Company Name是可能的,但仅出于向后兼容性原因并且完全过时。 我的建议是写信至Appdata,是.\Local.\LocalLow还是.\Roaming是您的选择,但有最佳做法(read this post) 您也可以使用%Programdata%\YourFolderName

为了使程序的实例彼此分开:取任一进程ID(这些在任何给定时间都是唯一的,但不是随着时间的推移),或使用随机数。 GUID是随机数(或随机字符串)的一个示例,但如果GUID看起来很丑,那么4字节(long)随机数也可以完成这项工作。