【问题标题】:C# Storage Folder Location for Portable Application便携式应用程序的 C# 存储文件夹位置
【发布时间】:2020-12-17 15:16:17
【问题描述】:

我需要一种方法来为可移植应用程序找到一个文件夹,如果它存在(否则可以创建),并且用户和应用程序都可以访问该文件夹,以便其中的文件可以由用户编辑和添加,由应用程序读取/编辑(因此,嵌入式资源不能解决问题)。

我的问题是我不知道默认文件夹/目录应该在哪里。它应该与应用程序.exe 在同一个文件夹中吗?我应该使用SpecialFolder 吗?还是完全不同的东西?

这实际上更多是关于 C# 和 .NET 中可移植应用程序的标准实践的问题,而不是关于如何直接实现这一点的问题(尽管提到的任何特定类/代码的链接仍然很有帮助)。

到目前为止我的想法:

  • 我更喜欢将它放在与 .exe,那么如果应用程序文件夹移动了重要的 文件仍然可以很容易地手动定位。但是,如果用户要移动 Program Files 的应用程序,或其他东西(这似乎不是 太不合理了?),我担心文件可能最终需要 管理员权限编辑/打开,这将破坏应用程序。

  • 使用用户目录或类似目录也可以,但我不知道 对于可移植应用程序来说,这是否是可接受的标准做法 写入用户文件夹(对我个人来说似乎有点不对劲)。但我不 知道有没有办法让这道菜更美味?

任何建议将不胜感激。

【问题讨论】:

  • @NikolayB。不,恐怕不是。如前所述,我对标准做法更感兴趣,因为我已经很清楚如何找到有问题的目录,但不确定使用哪一个。
  • @NikolayB。这与这个问题无关。
  • 使用适当的Environment.SpecialFolder。不要使用 Program 文件夹或您的 .exe 文件夹。
  • @DourHighArch 你认为这对于可移植的应用程序是可以接受的吗?我知道其中很多位置是“隐藏的”(我认为 Microsoft Office 会在其中存储模板文件),我只打算存储非常小的文本文件,但我担心会弄乱东西。

标签: c# .net


【解决方案1】:

在 Windows 中,Program Files 归操作系统所有,而不归用户所有,也不归应用程序所有。它是操作系统用来存储第三方数据(包括二进制文件)的安全位置。标准用户无法在那里写入数据。

您不得试图规避这一点,让用户或第三方应用程序在那里更改数据,这样做会允许第三方将键盘记录器、后门程序、新帐户、比特币矿工、木马、rootkit 和勒索软件安装到您的操作中系统。永远不要这样做。

即使你这样做了;它行不通。当用户卸载应用程序时,Program Files 中的数据将被删除。如果用户或实用程序执行磁盘修复,程序文件中的数据将被删除并从保存点恢复。您可以存储在那里的任何数据都将很快被删除。如果您的应用是容器化的,那么每次用户关闭应用时,您的数据都会被删除。

如果是只读的,可以将数据存储在 Program Files 中。如果您的应用程序需要某种永久查找数据;说一本永远不会改变的单词词典,将其存储在 Program Files 中。删除应用时删除,恢复应用时恢复。

如果您的用户想要存储数据并希望在他们下次运行应用程序时或在他们卸载应用程序后存储数据,您必须将其存储在 Windows SpecialFolders 之一中。哪一个?这完全取决于您希望谁访问数据,以及他们将如何获取数据。是共享的吗?你想使用文件对话框吗?你还没有解释这些事情,所以我们不能给你答案。

这些文件夹都不是隐藏的;如果你想对用户和其他应用程序隐藏数据,你想要Isolated Storage

您所说的“便携式应用程序”是什么意思?你的意思是USB驱动器上的应用程序可以插入任何随机机器,运行应用程序,存储一些数据,拔下USB驱动器,将其插入另一台机器,再次运行应用程序并且你的数据仍然存在?您正在寻找虚拟机;创建一个普通的 Windows 应用程序,将数据存储在 SpecialFolders 中。当您的应用程序完成后,在 USB 驱动器上创建一个虚拟机并将您的应用程序安装到其中。这就是创建便携式磁盘实用程序和 Web 浏览器的方式。这样做的工作量很大,首先要让程序正常运行。

【讨论】:

  • “便携式应用程序”是指未安装在 Program Files 中的程序,而是从 ZIP 文件(或类似文件)中解压缩并直接从 .exe 运行的程序。但是,我在自己的文件系统中进行了挖掘,发现一些符合我经常使用的描述的程序确实将应用程序数据保存在适当的SpecialFolder 中,因此我很高兴遵循他们的示例和您的建议 -谢谢你的详细回答。
【解决方案2】:

如果您正在讨论在 Windows 上为广泛分布的应用程序放置文件的位置,我相信 Program Files(x86) 将是一个好用的地方,如果您正在谈论 Linux 发行版,那么 /etc是正常的。我在职业发展中必须做出的个人认识是认识到这些是我通常认为“神圣”或“为真正的开发者而设”的地方,而我是一个真正的开发者。

如果这只是一个与几个人共享的个人应用程序或类似的东西,我认为 .exe 的位置是一个非常合适的存储位置。

【讨论】:

  • 每个应用程序的程序文件都归操作系统所有,而不是用户所有。用户无法编辑它,当您卸载应用程序时,它会被删除。
  • 它肯定跨越了这两者之间的界限,但我希望让它更广泛地可用(老实说,我主要只是害怕必须制作一个合适的安装程序和一切,这可能是愚蠢的)。但是,它是一个很小的利基/独立软件,我希望将其保留为便携式 exe。我想我会从使用 .exe 位置开始,看看它是否会导致任何问题......
  • 程序文件绝对可以由用户编辑,如果您将运行应用程序所需的文件与您的软件一起打包,那么将它们放在@DourHighArch 是一个非常可行的地方
【解决方案3】:

这是使用程序目录的标准做法。您需要做的就是获取包含可执行文件的文件夹并使用它。例如,创建所需数量的新文件夹并将对象放入其中。即使用户移动了包含可执行文件的主目录,您的程序也能够毫无问题地找到新路径以及其中包含的所有文件。

(我不能将此作为评论,因为我需要更多的声誉,哈哈)

【讨论】:

    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    相关资源
    最近更新 更多