gpt4 book ai didi

delphi - 为什么使用 FILE_FLAG_NO_BUFFERING 打开文件时写入失败?

转载 作者:行者123 更新时间:2023-12-01 16:40:40 25 4
gpt4 key购买 nike

我正在尝试测量 FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING 对文件写入序列的影响,如 another question 中的请求。但我发现我无法写入设置了 FILE_FLAG_NO_BUFFERING 的文件。

当我使用它时,Delphi 返回 EWriteError 并带有消息stream read error

使用的代码如下:

procedure TForm1.btn1Click(Sender: TObject);
var
fsFSArquivoAAC: TFileStream;
L, lastErr: Cardinal;
R: WideString;
hn: THandle;
begin
hn := Windows.CreateFile( PChar('TesteAAC.AAC2'),
GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL or FILE_FLAG_WRITE_THROUGH or FILE_FLAG_NO_BUFFERING, 0);

lastErr := GetLastError();

if (lastErr <> ERROR_SUCCESS) then
begin
if (lastErr <> ERROR_ALREADY_EXISTS ) then
begin
MessageDlg('Whoops, something went wrong with CreateFile!',
mtError, [mbOK], 0);
end
else
begin
SetLastError(ERROR_SUCCESS);
end;

end;

fsFSArquivoAAC := TFileStream.Create( hn );

try
R := 'BatatinhaquandoNasceEspalharamapelochao';

// write WideString
L := Length(R);
fsFSArquivoAAC.WriteBuffer(L, SizeOf(integer));
if L > 0 then
fsFSArquivoAAC.WriteBuffer(R[1], L * SizeOf(WideChar));
finally
fsFSArquivoAAC.Free;
end;

如果您注释FILE_FLAG_NO_BUFFERING,则代码可以正常工作。为什么?

最佳答案

如果您使用FILE_FLAG_WRITE_THROUGHFILE_FLAG_NO_BUFFERING,则有various requirements用于对齐内存中的缓冲区、将写入与磁盘扇区对齐以及(我认为)以扇区大小的倍数写入。您似乎没有做任何这些事情。

关于delphi - 为什么使用 FILE_FLAG_NO_BUFFERING 打开文件时写入失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10823498/

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