让我们假设我的应用程序处于命名状态mysoft
,而我想读取的文件是afile.bin
.mysoft
在程序文件夹中.我们还假设没有使用管理员权限执行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;
Run Code Online (Sandbox Code Playgroud)
上面的简单代码将afile.bin
在兼容性文件文件夹中创建一个副本.
我的问题是:
我再次只阅读数据文件,我不明白.
调用Reset
结果打开文件进行写入.那是因为默认值System.FileMode
是fmOpenReadWrite
.由于您的应用程序运行虚拟化,并且由于您的用户令牌没有管理员权限,因此虚拟化层会启动并在虚拟存储中创建该文件的副本.
使用旧版Pascal I/O可用的解决方案是设置FileMode
为fmOpenRead
.然后Reset
将打开文件进行读取,并且不会调用虚拟化层.
请记住,这FileMode
是一个影响所有传统Pascal I/O的全局变量.临头你,如果你有线程,或者忘记设置FileMode
回fmOpenReadWrite
当你需要编写一个文件.反叛不是吗?处理广泛的全局标志以控制文件访问模式!好吧,这些东西是在应用程序有线程之前发明的.早在OOP发明之前.所以我能理解为什么会这样.
从中汲取的教训是,现在是时候切换到一种现代形式的文件访问.例如,TFileStream
.
实际上,也是您在应用程序中禁用虚拟化的时候了.近6年前,Vista中引入了虚拟化.这对于尚未针对Vista进行重新编译的旧程序来说是一种帮助.您的应用程序不应该仍在使用它.