我需要一种方法来为一个可移植应用程序找到一个文件夹,如果它存在(否则就可以创建),并且用户和应用程序都可以访问该文件夹,这样用户就可以编辑和添加其中的文件,应用程序也可以读取/编辑其中的文件(因此,嵌入式资源并不能解决问题)。
我的问题是,我不知道默认文件夹/目录应该在哪里。它应该和应用程序.exe
在同一个文件夹中吗?我应该使用SpecialFolder
吗?或者完全是别的什么?
这实际上更多的是关于C#和.NET中可移植应用程序的标准实践的问题,而不是关于如何直接实现这一点的问题(尽管链接到提到的任何特定类/代码仍然非常有用)。
到目前为止我的想法:
-
我更喜欢将其与
.exe
,就好像应用程序文件夹被重要的文件仍然可以很容易地手动定位。但是,如果用户要移动Program Files
的应用程序,或者其他什么(似乎太不合理了?),我担心这些文件最终可能需要编辑/打开的管理员权限,这将中断应用程序。 -
使用用户目录或类似的目录也可以,但我不知道对于可移植应用程序来说正在写入用户文件夹(对我个人来说似乎有点不对劲)。但我没有知道是否有办法让它更可口吗?
如有任何建议,我们将不胜感激。
在Windows中,程序文件由操作系统所有,而不是由用户和应用程序所有。它是操作系统用来存储第三方数据(包括二进制文件)的安全位置。标准用户没有能力在那里写入数据。
你不能试图绕过这一点,让用户或第三方应用程序在那里更改数据,这样做允许第三方在你的操作系统中安装密钥记录器、后门、新帐户、比特币矿工、木马、rootkit和勒索软件。永远不要这样做。
即使你这样做了;它不会起作用。当用户卸载应用程序时,程序文件中的数据将被删除。如果用户或实用工具执行磁盘修复,程序文件中的数据将从保存点删除并恢复。你可以存储在那里的任何数据都会很快被删除。如果您的应用程序是容器化的,那么每次用户关闭应用程序时,您的数据都会被删除。
如果数据是只读的,则可以将数据存储在程序文件中。如果您的应用程序需要某种永久查找数据;说一本永远不会改变的单词词典,将其存储在程序文件中。它将在应用程序被删除时被删除,并在应用程序恢复时被恢复。
如果您的用户希望存储数据,并希望在下次运行应用程序时或卸载应用程序后将其存储在其中,则必须将其存储到WindowsSpecialFolder
s中。哪一个?这完全取决于你想让谁访问数据,以及他们将如何获得数据。数据是共享的吗?是否要使用文件对话框?你还没有解释这些事情,所以我们不能给你答案。
这些文件夹都没有隐藏;如果要向用户和其他应用程序隐藏数据,则需要"独立存储"。
你所说的"可移植应用程序"是什么意思?你是指USB驱动器上的应用程序吗?你可以插入任何随机机器,运行你的应用程序,存储一些数据,拔下USB驱动器,将其插入另一台机器,再次运行应用程序,你的数据仍然存在?您正在寻找一台虚拟机;创建一个普通的Windows应用程序,将数据存储在SpecialFolders中。应用程序完成后,在USB驱动器上创建一个虚拟机,并将应用程序安装到其中。这就是创建便携式磁盘实用程序和web浏览器的方法。要做到这一点需要做大量的工作,首先必须让程序正常运行。
如果您正在讨论在Windows上为广泛分布的应用程序放置文件的位置,我相信Program files(x86)将是一个很好的使用场所,如果您正在谈论Linux发行版,那么/etc/etc是正常的。我个人在职业发展中必须意识到,这些地方我通常认为是";神圣的";或";对于真正的开发商";我是一个真正的开发者。
如果这只是一个与几个人共享的个人应用程序或类似的东西,我认为.exe的位置是一个非常合适的存储位置。
这是使用程序目录的标准做法。你所需要做的就是获取包含可执行文件的文件夹并使用它。例如,创建所需数量的新文件夹并在其中放置对象。即使用户移动了带有可执行文件的主目录,您的程序也能够毫无问题地找到新路径和其中包含的所有文件。
(我不能把这作为评论,因为SO要求我更多的声誉哈哈)