procedure GenerateRandomFile(FileName : String; FileSize : Int64; CompressibilityPercentage : Integer);
const
BUFFER_LENGTH = 4;
ARRAY_LENGTH = 1 * 1024;
var
TheTime : Integer;
i, k : Integer;
BufArr : Array [0..ARRAY_LENGTH - 1] of Integer;
TheFile : TFileStream;
begin
TheTime := GetTickCount();
Randomize;
FileSize := Trunc(FileSize / BUFFER_LENGTH); // Buf (Integer) uses 4 bytes, thus we divide by 4
if (CompressibilityPercentage > 0) then
begin
CompressibilityPercentage := Trunc(100 / CompressibilityPercentage);
FileSize := Trunc(FileSize / CompressibilityPercentage);
if (CompressibilityPercentage > 1) then
Dec(CompressibilityPercentage);
end;
// ============================================ //
// Generate truly non-compressible, random file //
// ============================================ //
TheFile := TFileStream.Create(FileName, fmCreate OR fmOpenReadWrite);
with TheFile do
begin
for i := 0 to Trunc(FileSize / ARRAY_LENGTH) - 1 do // Iterate
begin
for k := 0 to (ARRAY_LENGTH - 1) do
BufArr[k] := Random(9999999) * i;
WriteBuffer(BufArr, BUFFER_LENGTH * ARRAY_LENGTH);
end; // for
// ============================ //
// Adjust compressibility level //
// ============================ //
for k := 1 to CompressibilityPercentage do
begin
for i := 0 to Trunc(FileSize / ARRAY_LENGTH) - 1 do // Iterate
begin
Position := (i * BUFFER_LENGTH * ARRAY_LENGTH);
Read(BufArr, BUFFER_LENGTH * ARRAY_LENGTH);
Position := Size;
WriteBuffer(BufArr, BUFFER_LENGTH * ARRAY_LENGTH);
end; // for
end; // for
Free;
end; // with
ShowMessage('Generated [' + FileName + '] in ' + IntToStr(GetTickCount() - TheTime) + ' milli-seconds');
end;