delphi - 如何共享应用程序和关联的数据文件
问题描述
我使用 delphi 社区版编写了一个程序(firemonkey)。我想分享这个程序,但是我的朋友要下载的 .exe 文件必须不时访问一个文本文件来检索字符串。在编写程序时,我使用了一个事件处理程序,在启动时加载文本文件:
tform3.formCreate(发件人:Tobject);...assignfile(myfile,('C:* * * *******.txt)); ...
在设计阶段工作得很好。
作为一个业余爱好者,我现在发现自己陷入了困境。如果我使用 INNO 安装编译器来创建我计划执行的安装程序,我不能对数据文件的位置有同样的硬连线引用 ('C:**** * )。我需要更改上述代码,以便 .exe 文件可以找到支持的数据文件,而不管 .exe 文件(和数据文件)在其他人的 PC 上的位置。
我怎样才能做到这一点?即我需要什么代码(代替上面的代码)来确保我分发的安装程序将安装一个.exe 文件,该文件可以找到它引用的数据文件?
任何帮助,非常感谢。还在学习。
解决方案
只读访问
如果数据文件应始终以只读模式打开,最简单的解决方案是将其放在 *.exe 文件旁边。然后,在运行时动态查找 *.exe 文件的路径并对其进行修改以查找数据文件的路径。例如,
uses
IOUtils;
procedure TForm1.FormCreate(Sender: TObject);
var
FileName: string;
begin
FileName := TPath.Combine(ExtractFilePath(ParamStr(0)), 'data.txt');
ShowMessage(TFile.ReadAllText(FileName, TEncoding.UTF8));
end;
ParamStr(0)
包含 *.exe 文件的路径,例如
'C:\Users\Andreas Rejbrand\Documents\Embarcadero\Studio\Projects\test\Win32\Debug\Project1.exe'
然后ExtractFilePath(ParamStr(0))
是
'C:\Users\Andreas Rejbrand\Documents\Embarcadero\Studio\Projects\test\Win32\Debug\'
最后,TPath.Combine(ExtractFilePath(ParamStr(0)), 'data.txt')
是
'C:\Users\Andreas Rejbrand\Documents\Embarcadero\Studio\Projects\test\Win32\Debug\data.txt'
确保安装程序将数据文件放在 *.exe 文件旁边。
读写访问
如果我们谈论的是每个用户需要更改的设置文件或其他文件(通过软件),则不能将其放在 *.exe 文件旁边,因为 *.exe 文件通常位于 Program Files 文件夹中,这是只读的。此外,只有一个 Program Files 文件夹,但 PC 上可能有很多用户,每个用户都应该有自己的副本。
解决方案是将文件保存在用户自己的文件夹中,具体来说就是AppData
文件夹:
FileName := TPath.GetHomePath + '\Mariner\My Word Processor App\Settings\settings.ini';
(使用不同的路径构建方法)。
在我的系统上,这变成
'C:\Users\Andreas Rejbrand\AppData\Roaming\Mariner\My Word Processor App\Settings\settings.ini'
您的安装程序(Inno Setup)内置支持将文件放置在此位置。
推荐阅读
- computer-science - Clips defRule 定义成功,但不与其他 defrules 一起触发
- javascript - 动态添加的 div 没有出现
- python - 避免在 Dataflow 上的 Apache Beam SDK 上使用 Python 在 Cloud Storage 上计算文件大小
- c# - 使用 3 个或更多页面时,GotoAsync 内置后退按钮不会返回上一页
- windows - 在 Windows CMake 'Configure' 错误上构建 OBS Studio Music Edition
- python - 如何正确使用 Adobe LiveCycle Designer 以编程方式制作 PDF 表单
- html - 如何使提交类型的按钮提交到不同的 URL?(不是它所在的页面)
- c# - 无法在 C# 中将类型“System.EventHandler”隐式转换为“System.Windows.Forms.KeyPressEventHandler”
- go - 如何在 github 中使用 goreleaser 构建子文件夹
- c - C - 字符串指针数组 - 如何动态分配内存