【问题标题】:After using InstallShield to install my app my sqlite .db file is being saved in the AppData directory. Why is that?使用 InstallShield 安装我的应用程序后,我的 sqlite .db 文件将保存在 AppData 目录中。这是为什么?
【发布时间】:2015-01-29 23:26:30
【问题描述】:

使用免费版本的 InstallShield 并在我的机器上安装我的应用程序后,我注意到我的数据文件(一个 sqlite .db 文件)保存在与我在 Visual Studio 下运行时不同的位置。基本上,它不是保存在带有 .exe 文件的目录中,而是保存在这里: C:\Users\blaaah\AppData\Local\VirtualStore\Program Files (x86)\MyAppA\MyAppA

我的 .exe 文件及其 .dll 文件保存在此处: C:\Program Files (x86)\MyAppA\MyAppA

我很好奇为什么会这样? 我也很好奇如何使用代码获取包含我的数据文件的目录。

【问题讨论】:

  • 因为 InstallShield 很聪明。 Google for AppData(例如,here 是什么)。

标签: c# installshield


【解决方案1】:

VirtualStore 文件夹是由 UAC 完成的文件系统重定向引起的。通过这样做,微软能够在不牺牲太多向后兼容性的情况下锁定 Program Files 目录。每当应用程序尝试写入程序文件位置时,写入将被重定向到虚拟存储。

可以在 User Account Control For Game Developers 文章中找到 MSDN 上有关此的不错的文章。

引用那篇文章:

虚拟化通过将系统敏感写入(以及后续文件或注册表操作)重定向到当前用户配置文件中的每个用户位置来影响文件系统和注册表。例如,如果应用程序尝试写入以下文件:

C:\Program Files\公司名称\Title\config.ini

写入会自动重定向到:

C:\Users\用户名\AppData\Local\VirtualStore\Program Files\Company Name\Title\config.ini

同样,如果应用程序尝试写入如下注册表值:

HKEY_LOCAL_MACHINE\软件\公司名称\标题

它将被重定向到:

HKEY_CURRENT_USER\Software\Classes\VirtualStore\MACHINE\Software\Company Name\Title

【讨论】:

  • 所以我需要查看注册表以找到我的数据文件所在的实际目录?没有某种命令,例如: Path.GetDirectoryName(Assembly.GetEntryAssembly().Location));我可以用它来找到它吗?
  • 不,您不应该将文件写入C:\Program Files\ ,而是将您的数据存储在System.Environment.SpecialFolder.ApplicationDataSystem.Environment.SpecialFolder.CommonApplicationData
  • 不,我要问的是如何获取数据文件的路径,当它被操作系统放置在这里时:C:\Users\blaaah\AppData\Local\VirtualStore\Program Files (x86 )\MyAppA\MyAppA 如何使用一些 C# 代码找出文件的实际物理位置。
  • 请阅读这个答案:stackoverflow.com/questions/20570754/…。简而言之,不要依赖重定向,将文件保存到适当的位置。
  • 是的,我认为你是对的。将它们保存到适当的位置将避免很多痛苦和悲伤。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多