Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с каталогами и файлами.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Катя
Помогите с написанием программы,а то в понедельник сдавать надо плиз.

Программа начинает работу в заданном каталоге и спускается по дереву каталогов,записывая по пути размеры всех встретившихся ей файлов.Закончив сканирование каталога,программа должна распечатать гистограмму размеров файлов,используя шаг гистограммы в качестве параметра(например, при шаге 1024,файлы размером от 0 до 1023 байт попадают в один интервал,от 1024 до 2047 байт в другой и т.д.)
volvo
Уже было где-то ... Но в общем случае - FindFirst/FindNext, проверяешь очередное имя файла на атрибут "каталог", и если этот атрибут установлен - запускаешь Ее Величество Рекурсию wink.gif
volvo
Вот... нашел, где это было:
FAQ: Файлы -> Поиск файла по директориям

Чуть-чуть подправить...
Катя
Как сделать так что бы файлы выводились поблочно(по размерам) от 0-1023, 1023-2047....
klem4
Вот сделал набросок .. но с ограничениями ... запускать программу с такими данными будет полезно только для файлов, размером от 1 до 20 мб, если чемто поможет, хорошо smile.gif Если надо можно и гистограмму сделать ...

{$r-}
uses crt, dos;

const
   maxDegree = 19;
   step = 1024 * 1024;

type

   TLong = array[0..maxDegree] of byte;
var
   startDir : string;

   sizes : TLong;

procedure GetFiles(fn, dir : string; var L : TLong);
var
   search : SearchRec;
begin

      if dir[length(dir)] <> '\' then
       dir := dir + '\';

      FindFirst(dir + fn, AnyFile, search);

      while dosError = 0 do begin
         if search.attr <> $10 then begin
            writeln(search.name:15, (search.size div step) : 10);
            inc(L[search.size div step])
         end;
         FindNext(search);
      end;

      FindFirst(dir + '*.*', Directory, search);

      while doserror = 0 do begin
         if (search.attr and 16 <> 0) and (search.name[1] <> '.') then
          GetFiles(fn, dir + search.name, L);
         FindNext(search);
      end;

end;

var
   i : byte;
begin

   clrscr;

   FillChar(sizes, sizeof(sizes),0);

   GetFiles('*.*','c:\Downloads\Music\Rok', sizes);

   writeln;

   for i := 1 to maxDegree do
    if sizes[i] <> 0 then
   writeln(i,' mb : ',sizes[i]);
   readln;
end.

Катя
Да пожалуйста сделай гистограмму, заранее спасибо!!!
volvo
Катя, Горизонтальная ч/б гистограмма в текстовом режиме (шаг гистограммы = 100Кб, диапазон размеров файлов - от 100К до 2Мб)

Если надо добавить цвет - скажи, сделаем... yes2.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.