Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > КАК узнать обьем папки?


Автор: vood 23.2.2006, 02:19
КАК узнать обьем папки?

Автор: remax 23.2.2006, 02:59
Если подразумевается суммарный объем файлов, то соответственно придется перебирать файлы, входящие в эту папку с учетом вложенных папок.

Автор: <Spawn> 23.2.2006, 08:10
Рекурсией. Темы обхода директорий не раз были на форуме. Поищите их и на этой основе легко будет посчитать общий размер.

Автор: Guedda 23.2.2006, 09:22
Код

type
  TGetDirSizeCallback = procedure(Tag: Integer; CurrentSize: Int64);

procedure GetDirSize(Dir: string; IncludeSubDirs: Boolean; var Result: Int64;
  CallbackProc: TGetDirSizeCallback = nil; CallbackTag: Integer = 0); overload;
var
  SearchRec: TSearchRec;
  FindResult: Integer;
begin
  Dir := IncludeTrailingBackslash(Dir);
  FindResult := FindFirst(Dir + '*.*', faAnyFile, SearchRec);
  try
    while FindResult = 0 do
      with SearchRec do
      begin
        if (Attr and faDirectory) <> 0 then
        begin
          if IncludeSubDirs and (Name <> '.') and (Name <> '..') then
            GetDirSize(Dir + Name, IncludeSubDirs, Result, CallbackProc,
              CallbackTag);
        end
        else
        begin
          Result := Result + Cardinal(Size);
          if Assigned(CallbackProc) then
            CallbackProc(CallbackTag, Result);
        end;
        FindResult := FindNext(SearchRec);
      end;
  finally
    FindClose(SearchRec);
  end;
end;

function GetDirSize(Dir: string; IncludeSubDirs: Boolean = True): Int64;
  overload;
begin
  GetDirSize(Dir, IncludeSubDirs, Result, nil, 0);
end;

Пример использования:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  S: Int64;
begin
  S := 0;
  GetDirSize('с:\WINDOWS', True, S, @TForm1.GetDirCallback, Integer(Self));
  Label1.Caption := IntToStr(S);
end;

procedure TForm1.GetDirCallback(CurrentSize: Int64);
begin
  Label1.Caption := IntToStr(CurrentSize);
  Label1.Repaint;
end;



Автор: vood 25.2.2006, 07:26
Пасибо? Vinyl Man
Добавлено @ 07:27
Пасибо, Vinyl man

Автор: MetalFan 20.7.2009, 12:13
Guedda, всем хорош код, но может криво считаться размер при использовании сокращенной GetDirSize.
а все потому, что Result не инициализирован нулем.
10 минут голову ломал, что за нафиг smile )

Добавлено @ 12:14
+ еще не уверен, что корректно будет работать колбэк в примере...

Автор: Yanis 20.7.2009, 13:55
Размер папки можно узнать через Microsoft Windows Script (через http://msdn.microsoft.com/en-us/library/6kxy1a51%28VS.85%29.aspx):
Код
var
  oFS: Variant;
  sz: Integer;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  ShowMessage(string(oFS.GetFolder('c:\windows\help').Size div 1024) + ' KB');
end;

Надеюсь пояснять не требуется. Экзампл всё сам за себя говорит.

Автор: MetalFan 20.7.2009, 14:16
Yanis, супер) а может такое быть, что Microsoft Windows Script не устанволен на клиентской машине?

Автор: CodeMonkey 20.7.2009, 14:19
Интересно, как последний вариант решает http://forum.vingrad.ru/index.php?showtopic=245811&view=findpost&p=1772411.

Автор: Yanis 20.7.2009, 14:58
Цитата(MetalFan @  20.7.2009,  15:16 Найти цитируемый пост)
а может такое быть, что Microsoft Windows Script не устанволен на клиентской машине? 


*Задумался* Знаешь, мне кажется нет ничего такого, что не могло бы случиться с пользовательской машиной. Наверняка найдутся такие индивиды, которые в ходе экспериментов с системой каким-то образом удалили какую-то часть WS. Реестр, знатно, можно по всякому изуродовать. Но, на девственной винде XP пример должен работать без докручивания.

Сам объект FSO хранится в так называемой Scripting Type Library (C:\WINDOWS\system32\scrrun.dll). Т.е. эта либа должна быть зарегена в системе, чтобы мы могли получить доступ к FSO.

Если сделать:
Код
regsvr32 /u scrrun.dll

то будет ошибка при попытке создать класс FSO:
Цитата
---------------------------
Project1
---------------------------
Недопустимая строка с указанием класса, ProgID: "Scripting.FileSystemObject"
---------------------------
ОК   
---------------------------


Если есть опасения, что либа может не присутствовать, то можно тоскать с собой длл-у и делать ей «regsvr32 scrrun.dll».

Добавлено через 3 минуты и 34 секунды
Цитата(Yanis @  20.7.2009,  15:58 Найти цитируемый пост)
Если есть опасения, что либа может не присутствовать, то можно тоскать с собой длл-у и делать ей «regsvr32 scrrun.dll». 

Но это, конечно, изврат. Проще самому по папке пробежать и посчитать.

Автор: Yanis 20.7.2009, 15:33
Цитата(CodeMonkey @ 20.7.2009,  15:19)
Интересно, как последний вариант решает http://forum.vingrad.ru/index.php?showtopic=245811&view=findpost&p=1772411.

Полагаю, что узнать это можно только лишь экспериментальным путём.

Автор: MetalFan 20.7.2009, 17:41
CodeMonkey, ну вопросы я бы сказал там специФИЧЕские) в большинстве случаев можно о них не беспокоиться имхо.

Автор: CodeMonkey 20.7.2009, 19:35
Почему-же? К примеру, наличие hard-link - не такая уж редкая ситуация. И чем дальше - тем чаще такое будет встречаться.

Автор: Riply 21.7.2009, 03:24
Цитата(CodeMonkey @  20.7.2009,  19:35 Найти цитируемый пост)
Почему-же? К примеру, наличие hard-link - не такая уж редкая ситуация. И чем дальше - тем чаще такое будет встречаться. 


Угу. Поставила тут Win 7 посмотреть с чем едят сие чудо.
Так там и плюнуть на системном диске некуда - обязательно на какой-нибудь редирект попадешь smile
Sorry за оффтоп.


Цитата(MetalFan @  20.7.2009,  17:41 Найти цитируемый пост)
ну вопросы я бы сказал там специФИЧЕские) в большинстве случаев можно о них не беспокоиться имхо.


Ну почему же ? 
Говорят, что KV плодит файловые потоки без всякого зазрения совести и в огромных количествах smile

Автор: MetalFan 21.7.2009, 13:06
Riply, кто такой KV? )

Автор: Riply 21.7.2009, 13:12
Цитата(MetalFan @  21.7.2009,  13:06 Найти цитируемый пост)
Riply, кто такой KV? ) 


Sorry, если не так его обозвала.
Имелся ввиду антивирус Касперского или Кашперовского.
Черт ! Все время их путаю, уж очень похожи smile

Автор: Yanis 21.7.2009, 14:17
Цитата(Riply @  21.7.2009,  14:12 Найти цитируемый пост)
Черт ! Все время их путаю, уж очень похожи

То есть, есть Антивирус Касперского и Кашперовского?  smile 

Автор: Riply 21.7.2009, 14:28
Yanis, неа.  Антивирус, вроде один.
А вот кто его автор, все время путаю smile

P.S.
 Ой, чуствую забанят меня за флуд злостный smile

Автор: MetalFan 21.7.2009, 15:33
Riply, тебя забанят? не смеши)
да, антивирус касперского - жесть.
Но опять же повторюсь, для общего случая достаточно посчитать просто объем всех файлов рекурсивно

Автор: Riply 21.7.2009, 16:20
Цитата(MetalFan @  21.7.2009,  15:33 Найти цитируемый пост)
Но опять же повторюсь, для общего случая достаточно посчитать просто объем всех файлов рекурсивно 


Ну для чего нам это может понадобиться ?
Самые жизненные варианты типа: выяснить хватит ли нам места для копирования на флешку или еще куда.
И, как раз здесь, мы и можем попасть в засаду из-за потоков или редиректов...
Разумеется, если мы только хотим вывести куда-то информацию, то пойдет... для красоты smile,
ибо другой практической ценности у нее не будет, т.к. она может не соответствовать действительности.

Автор: MetalFan 21.7.2009, 19:48
Цитата(Riply @  21.7.2009,  16:20 Найти цитируемый пост)
она может не соответствовать действительности. 

ключевое слово тут - может, а может и соответствовать) а какая практическая ценность у размера с учетом потоков, кластеров и пр.? при копировании, например, какую пользу она может принести? разве скрытые потоки копируются(простите за неосведомленность)?

Автор: AntonN 21.7.2009, 20:57
Цитата

разве скрытые потоки копируются(простите за неосведомленность)?

при копировании, проверенного касперским, файла на флешку с fat32 система честно предупреждает, что будут утеряны некоторые в файловых потоках прикрепленные к этому файлу. Соответственно - копируются smile

Автор: MetalFan 21.7.2009, 21:50
Цитата(AntonN @  21.7.2009,  20:57 Найти цитируемый пост)
будут утеряны


Цитата(AntonN @  21.7.2009,  20:57 Найти цитируемый пост)
Соответственно - копируются

хм, как-то нелогично выходит) если с нтфс на фат копировать, то выходит, что не копируются...

Автор: AntonN 21.7.2009, 22:03
с нтфс на фат - нет, а с нтфс на нтфс - да

Автор: Riply 22.7.2009, 05:08
Цитата(MetalFan @  21.7.2009,  19:48 Найти цитируемый пост)
а какая практическая ценность у размера с учетом потоков, кластеров и пр.? при копировании, например, какую пользу она может принести? 


А я и не говорила что она есть smile
В этом вопросе, я полностью солидарна с CodeMonkey в плане того,
что в общем случае  задача решения не имеет.

Топиковый вопрос приобретает смысл, только с детальными пояснениями для
чего вся эта каша нам понадобилась и что мы хотим получить в конце.
Под детальными пояснениями я понимаю ответы почти на все вопросы, перечисленные CodeMonkey. 

Цитата(MetalFan @  21.7.2009,  19:48 Найти цитируемый пост)
разве скрытые потоки копируются(простите за неосведомленность)?

Могут копироваться, а могут и нет.
Завсит от FS и от способа копирования.

Автор: MetalFan 22.7.2009, 18:41
Усе понятно)
Но я то хотел обратить внимание копипастеров приведенного ранее куска кода для подсчета размера файлов в папках, что он содержит недочет... вот)

Автор: Riply 22.7.2009, 21:14
Цитата(MetalFan @  22.7.2009,  18:41 Найти цитируемый пост)
Но я то хотел обратить внимание копипастеров приведенного ранее куска кода для подсчета размера файлов в папках, что он содержит недочет... вот) 


Святое дело (без смайлика)

smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)