如何解决如何共享应用程序和关联的数据文件
我已经使用delphi社区版编写了程序(firemonkey)。我想共享该程序,但是我的朋友将要下载的.exe文件必须不时访问文本文件来检索字符串。编写程序时,我使用事件处理程序在启动时加载了文本文件:
tform3.formCreate(Sender:Tobject); ... Assignfile(myfile,('C:* * * **** ***。文本文件)); ...
在 设计阶段。
作为一名业余爱好者,我现在发现自己陷入困境。如果我打算使用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文件通常位于程序中。 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)具有将文件放置在此位置的内置支持。
,如果仅以只读方式访问它,则还可以考虑将其作为资源添加到可执行文件中。这样一来,您无需安装程序即可简单地分发此可执行文件。
Delphi Dabbler有一个例子,但是我发现它有点令人困惑。我仍然会link to it(PDF)。
,您可以让用户选择文件的保存位置。如果文件是针对每个用户的,则建议使用AppData文件夹;如果文件必须在不同的用户之间共享,则建议使用CommonAppData。
当用户选择了数据文件的目的地时,可以将其保存到INI文件中。可以不要求用户将INI文件存储到注册表中,也可以存储到AppData文件夹或ProgramData文件夹中保存的INI文件中。
这里摘录了一些特殊文件夹的源代码:
const
SectionWindow = 'Window';
SectionData = 'Data';
CompanyFolder = 'YourCompanyName';
constructor TForm1.Create(AOwner: TComponent);
var
CommonPath : array [0..MAX_PATH] of Char;
LocalPath : array [0..MAX_PATH] of Char;
LangFileName : String;
begin
SHGetFolderPath(0,CSIDL_COMMON_APPDATA,SHGFP_TYPE_CURRENT,@CommonPath[0]);
SHGetFolderPath(0,CSIDL_LOCAL_APPDATA,@LocalPath[0]);
FIniSection := SectionWindow;
FIniSectionData := SectionData;
FAppName := ChangeFileExt(ExtractFileName(Application.ExeName),'');
FCommonAppData := IncludeTrailingPathDelimiter(CommonPath) +
CompanyFolder + '\' + FAppName + '\';
FLocalAppData := IncludeTrailingPathDelimiter(LocalPath) +
CompanyFolder + '\' + FAppName + '\';
FIniFileName := FLocalAppData + FAppName + '.ini';
ForceDirectories(FCommonAppData);
ForceDirectories(FLocalAppData);
inherited Create(AOwner);
end;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。