2

別の質問のリクエストとして、ファイルへの一連の書き込みの影響FILE_FLAG_WRITE_THROUGHとその影響を測定しようとしています。しかし、セットでファイルを書き込めないことがわかりました。FILE_FLAG_NO_BUFFERINGFILE_FLAG_NO_BUFFERING

使用すると、DelphiEWriteErrorからメッセージが返されます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すると、コードが機能します。なんで?

4

1 に答える 1

7

使用FILE_FLAG_WRITE_THROUGHし、メモリ内のバッファーを整列するためのさまざまな要件FILE_FLAG_NO_BUFFERINGがある場合、書き込みをディスクセクターに整列させ、(私が思うに) セクターサイズの倍数で書き込みます。あなたはこれらのことをしていないようです。

于 2012-05-30T20:22:52.597 に答える