59 lines
2 KiB
Ada
59 lines
2 KiB
Ada
with Ada.Numerics.Elementary_Functions;
|
|
with Ada.Directories; use Ada.Directories;
|
|
with Ada.Strings.Fixed; use Ada.Strings;
|
|
with Ada.Command_Line; use Ada.Command_Line;
|
|
with Ada.Text_IO; use Ada.Text_IO;
|
|
|
|
with Dir_Iterators.Recursive;
|
|
|
|
procedure File_Size_Distribution is
|
|
|
|
type Exponent_Type is range 0 .. 18;
|
|
type File_Count is range 0 .. Long_Integer'Last;
|
|
Counts : array (Exponent_Type) of File_Count := (others => 0);
|
|
Non_Zero_Index : Exponent_Type := 0;
|
|
Directory_Name : constant String := (if Argument_Count = 0
|
|
then "."
|
|
else Argument (1));
|
|
Directory_Walker : Dir_Iterators.Recursive.Recursive_Dir_Walk
|
|
:= Dir_Iterators.Recursive.Walk (Directory_Name);
|
|
begin
|
|
if not Exists (Directory_Name) or else Kind (Directory_Name) /= Directory then
|
|
Put_Line ("Directory does not exist");
|
|
return;
|
|
end if;
|
|
|
|
for Directory_Entry of Directory_Walker loop
|
|
declare
|
|
use Ada.Numerics.Elementary_Functions;
|
|
Size_Of_File : File_Size;
|
|
Exponent : Exponent_Type;
|
|
begin
|
|
if Kind (Directory_Entry) = Ordinary_File then
|
|
Size_Of_File := Size (Directory_Entry);
|
|
if Size_Of_File = 0 then
|
|
Counts (0) := Counts (0) + 1;
|
|
else
|
|
Exponent := Exponent_Type (Float'Ceiling (Log (Float (Size_Of_File),
|
|
Base => 10.0)));
|
|
Counts (Exponent) := Counts (Exponent) + 1;
|
|
end if;
|
|
end if;
|
|
end;
|
|
end loop;
|
|
|
|
for I in reverse Counts'Range loop
|
|
if Counts (I) /= 0 then
|
|
Non_Zero_Index := I;
|
|
exit;
|
|
end if;
|
|
end loop;
|
|
|
|
for I in Counts'First .. Non_Zero_Index loop
|
|
Put ("Less than 10**");
|
|
Put (Fixed.Trim (Exponent_Type'Image (I), Side => Left));
|
|
Put (": ");
|
|
Put (File_Count'Image (Counts (I)));
|
|
New_Line;
|
|
end loop;
|
|
end File_Size_Distribution;
|