Changeset 2 for trunk/UFormMain.pas


Ignore:
Timestamp:
Mar 25, 2016, 10:24:04 PM (8 years ago)
Author:
chronos
Message:
  • Added: Ability to write data with defined byte pattern.
Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

    • Property svn:ignore set to
      CoolDisk
      lib
      CoolDisk.lps
  • trunk/UFormMain.pas

    r1 r2  
    4848  end;
    4949
     50  TRunMode = (rmRead, rmWrite);
     51
    5052  { TDriveScan }
    5153
     
    6668    DamagedBlockCount: Integer;
    6769    Drive: string;
     70    Mode: TRunMode;
     71    WritePattern: Byte;
    6872    function GetElapsedTime: TDateTime;
    69     procedure Scan;
     73    procedure Run;
    7074    constructor Create;
    7175    destructor Destroy; override;
     
    9397    ButtonScan1: TButton;
    9498    ButtonScan2: TButton;
     99    ComboBoxRunMode: TComboBox;
     100    EditPattern: TEdit;
    95101    EditDrive: TEdit;
    96102    Image1: TImage;
     
    103109    Label7: TLabel;
    104110    Label8: TLabel;
     111    Label9: TLabel;
    105112    LabelElapsedTime: TLabel;
    106113    LabelBlockSize: TLabel;
     
    155162procedure TScanThread.Execute;
    156163begin
    157   TFormMain(Form).DriveScan.Scan;
     164  TFormMain(Form).DriveScan.Run;
    158165end;
    159166
     
    313320end;
    314321
    315 procedure TDriveScan.Scan;
     322procedure TDriveScan.Run;
    316323var
    317324  F: TFileStream;
    318   ReadSize: Integer;
     325  RealSize: Integer;
    319326  Buffer: array of Byte;
    320327  I: Integer;
     
    325332  Terminated := False;
    326333  DamagedBlockCount := 0;
    327   F := TFileStream.Create(Drive, fmOpenRead);
     334  if Mode = rmRead then F := TFileStream.Create(Drive, fmOpenRead)
     335    else if Mode = rmWrite then F := TFileStream.Create(Drive, fmOpenReadWrite);
    328336  BlockMap.SectorCount := F.Size div SectorSize;
    329337  BlockMap.Clear;
    330338  SetLength(Buffer, SectorSize);
     339  if Mode = rmWrite then
     340    FillChar(Buffer[0], Length(Buffer), WritePattern);
    331341  for I := 0 to BlockMap.SectorCount - 1 do begin
    332342    SectorCurrent := I;
     
    336346
    337347      if ConfigTest then begin
    338         if Random < 0.000001 then ReadSize := 0
    339           else ReadSize := SectorSize;
     348        if Random < 0.000001 then RealSize := 0
     349          else RealSize := SectorSize;
    340350        //Sleep(1);
    341351      end else begin
    342352        F.Position := I * SectorSize;
    343         ReadSize := F.Read(Buffer[0], SectorSize);
     353        if Mode = rmRead then RealSize := F.Read(Buffer[0], SectorSize)
     354          else if Mode = rmWrite then RealSize := F.Write(Buffer[0], SectorSize)
     355          else raise Exception.Create('Unknwon run mode');
    344356      end;
    345357    finally
    346358      Lock.Acquire;
    347359    end;
    348     if ReadSize <> SectorSize then begin
     360    if RealSize <> SectorSize then begin
    349361      BlockMap.Sectors[I] := bsDamaged;
    350362      Inc(DamagedBlockCount);
     
    416428  DriveScan.SectorSize := Project.SectorSize;
    417429  DriveScan.Terminated := False;
     430  DriveScan.Mode := TRunMode(ComboBoxRunMode.ItemIndex);
     431  DriveScan.WritePattern := StrToInt(EditPattern.Text);
    418432  ScanThread.Start;
    419433  UpdateInterface;
Note: See TracChangeset for help on using the changeset viewer.