gpt4 book ai didi

Delphi:文件访问和兼容性文件(Windows 7)

转载 作者:行者123 更新时间:2023-12-03 15:23:37 28 4
gpt4 key购买 nike

假设我的应用程序名为 mysoft,我想要读取的文件是 afile.binmysoft 位于程序文件夹中。我们还假设 mysoft 不是以管理员权限执行的。

procedure TForm1.Button1Click(Sender: TObject);
var
afile: File of Byte;
begin
AssignFile(Infile, 'C:\Program Files\mysoft\afile.bin');
Reset(afile);
CloseFile(afile);
end;

上面的简单代码将在兼容性文件文件夹中创建 afile.bin 的副本。

我的问题是:

  1. 为什么?我只读了该死的文件,我不想修改它。
  2. 除了将文件移动到另一个文件夹中之外,如何防止这种情况发生?

同样,我只读取了数据文件,但没有得到它。

最佳答案

调用Reset会导致文件被打开以进行写入。这是因为默认值System.FileModefmOpenReadWrite。由于您的应用程序以虚拟方式运行,并且您的用户 token 没有管理员权限,因此虚拟化层会启动并在虚拟存储中创建文件的副本。

使用旧版 Pascal I/O 的可用解决方案是将 FileMode 设置为 fmOpenRead。然后Reset将打开文件进行读取,并且不会调用虚拟化层。

请记住,FileMode 是一个全局变量,会影响所有旧版 Pascal I/O。如果您有线程,或者在需要写入文件时忘记将 FileMode 设置回 fmOpenReadWrite,那么您将遭遇不幸。不是很反叛吗?处理广泛的全局标志来控制文件访问模式!嗯,这个东西早在应用程序拥有线程之前就被发明了。早在 OOP 发明之前。所以我可以理解为什么会这样。

从中吸取的教训是,是时候切换到一种现代的文件访问形式了。例如,TFileStream

事实上,您也应该在应用程序中禁用虚拟化。近 6 年前,Vista 中引入了虚拟化。它的目的是为尚未针对 Vista 重新编译的旧程序提供帮助。您的应用程序不应仍在使用它。

关于Delphi:文件访问和兼容性文件(Windows 7),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12823736/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com