TFileStream.WriteBuffer XE4 对比 XE7

TFileStream.WriteBuffer XE4 VS XE7

此代码 运行ning 在 Delphi XE4 上非常好:

var
b: byte;
fl: TFileStream;
filename:string;
begin
b:= F;
filename:='C:\test.exe';
fl:= tFileStream.Create(filename, 0,fmOpenReadWrite);
fl.Position:= $C;
fl.WriteBuffer(b,sizeof(b));
fl.free
end;

但是,当我 运行 在同一台 PC 上 Delphi XE7 上使用完全相同的代码时,它失败并显示错误 "Stream write error"。

TFileStream 构造函数中,您将 Mode 参数设置为 0 (fmOpenRead),将 Rights 参数设置为 fmOpenReadWrite。你需要交换它们:

//fl:= tFileStream.Create(filename, 0, fmOpenReadWrite);
fl:= tFileStream.Create(filename, fmOpenReadWrite, 0);

或者简单地说:

fl:= tFileStream.Create(filename, fmOpenReadWrite);

fmCreate 标志不存在于 Mode 参数中时,TFileStream 调用 FileOpen() 而不是 FileCreate()

在 XE4 中,当 TFileStream 在 Windows 上调用 FileOpen() 时,ModeRights 参数被 OR 组合在一起:

inherited Create(FileOpen(AFileName, Mode or Rights));
// which is: FileOpen(AFileName, fmOpenRead or fmOpenReadWrite)
// effectively: FileOpen(AFileName, fmOpenReadWrite)

这就是您的代码在 XE4 中工作的原因。您正在以 read/write 模式打开文件。

在 XE7 中,TFileStream 每个 平台上调用 FileOpen() 时忽略 Rights 参数:

inherited Create(FileOpen(AFileName, Mode));
// effectively: FileOpen(AFileName, fmOpenRead)

这就是为什么您的代码在 XE7 中不起作用的原因。您正在以只读模式打开文件。