我们有一个 Windows 应用程序,它可以安装在程序文件中,也可以从其他地方复制和使用。此外,客户经常希望在同一台机器上使用多个版本的应用程序(长话短说:客户有 N 个项目,每个项目都处于不同的阶段,因此每个项目都需要我们应用程序的不同版本。客户群是我们应用程序之上的自己的项目/框架)。
我们开始看到客户提示运行我们的应用程序需要管理员权限,因为:
- 我们将文本日志写入本地文件夹。我们也使用 Windows 事件作为日志,但需要文本日志。
- 我们将数据库缓存写入本地文件夹。数据库缓存应尽可能在应用程序运行之间持续存在。
- 我们还编写了一些其他文件,例如仅在应用运行生命周期中需要的固件,并且可以在应用关闭时删除。
我们决定我们应该为此做点什么。也许我们应该将所有这些内容写入 %AppData%/[someFolder]
。问题是客户可能有我们应用程序的多个不同实例,他们应该有单独的日志/缓存。客户甚至可能安装了两次相同的版本,因此我们不能使用版本作为 key 。
目前的想法是使用 Assembly.GetEntryAssembly().Location
作为键,因此写入的路径将类似于 $"%AppData%\{Path.GetDirectoryName(Assembly. GetEntryAssembly().Location)}”
。这可能会奏效,但看起来很奇怪而且很老套。
有没有更好的方法来管理这个?我也在考虑向每个应用程序实例发出一个 GUID 并改为使用它,但我不确定如何正确地做到这一点。
最佳答案
写入 c:\Program Files
或 C:\Company Name
都不是好主意,并且与 Windows 最佳实践相冲突。写入程序文件需要管理员权限是有原因的!写入 C:\Company Name
是可能的,但只是出于向后兼容的原因,并且已经完全过时了。
我的建议是写入Appdata
,无论是.\Local
、.\LocalLow
还是.\Roaming
是您的选择,但有最佳实践 ( read this post )
您还可以使用 %Programdata%\YourFolderName
。
为了使您的程序实例彼此分离:采用任一进程 ID(它们在任何给定时间都是唯一的,但不会随时间推移),或使用随机数。 GUID 是随机数(或随机字符串)的一个示例,但如果 GUID 对您来说很难看,4 字节(long
)随机数也可以完成这项工作。
关于c# - 在某处写入日志和数据的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42668900/