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()
时,Mode
和 Rights
参数被 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 中不起作用的原因。您正在以只读模式打开文件。
此代码 运行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()
时,Mode
和 Rights
参数被 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 中不起作用的原因。您正在以只读模式打开文件。