FDelph
FDelph

Reputation: 33

Delphi: How to catch TStreamWriter Disk full error?

I wonder, why this code does not catch a 'Disk Full' error like it should?

This is important because the user may lose their data if they do not notice that the saving failed.

I don't get this...

procedure TForm2.Button1Click(Sender: TObject);
var
  Writer: TStreamWriter;
  n : integer;
begin
Writer := TStreamWriter.Create('MyUTF8Text.txt', false, TEncoding.UTF8);
  Try //Finally
    Try //Except
      
      for n := 1 to 1000 do
      begin
        Writer.WriteLine('Testing text writing to the UTF-8 file.');
      end;
    Except
      on E: Exception do
      begin
        ShowMessage('Exception Class name: ' + E.ClassName);
        ShowMessage('Exception Message: ' + E.Message);
      end;
    end; // except
  Finally
    Writer.Free(); 
  End; //finally
end;

"BTW. 'Writer might not be initialized' warning, is it serious really?"

Edit: There was this warning because TStreamWriter.Create was after TRY. Thanks for your advice I corrected that line of code to the correct location before(!) the TRY.

Upvotes: 0

Views: 318

Answers (1)

Tav
Tav

Reputation: 344

Try This:

procedure WriteStream;
var
  Writer: TStreamWriter;
  fs: TFileStream;
  s: String;
  n, bytesWritten : integer;
begin
  bytesWritten := 0;
  fs := TFileStream.Create('MyUTF8Text.txt', fmCreate);
  try
    //avoid warning by initiaizing before try
    Writer := TStreamWriter.Create(fs);
    try //Finally
      try //Except
        for n := 1 to 10 do
        begin
          s := 'Testing text writing to the UTF-8 file.'  + '#13#10';
          //keep count of bytes written
          bytesWritten := bytesWritten + TEncoding.UTF8.GetByteCount(s);
          Writer.Write(s);
        end;
        Writer.Flush;
        Writer.Close;
        //Check stream size to make sure all bytes written
        if bytesWritten <> Writer.BaseStream.Size then
          raise Exception.Create(String.Format('Expected %d bytes, wrote %d', [Writer.BaseStream.Size, bytesWritten]));
      except
        on E: Exception do
        begin
          Showmessage('Exception Class name: ' + E.ClassName);
          Showmessage('Exception Message: ' + E.Message);
        end;
      end; // except
    finally
      Writer.Free; // Will only free if it has been constructed
    end; //finally
  finally
    fs.Free;
  end;
end;

Upvotes: 1

Related Questions