Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


Определить размер папки
На страницу 1, 2  След.

Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Weiss
Гость







СообщениеВт, 25-Окт-2005 13:17    Заголовок сообщения: Определить размер папки
Цитата

Подскажите пожалюста как можно узнать размер папки...
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 25-Окт-2005 13:34 
Цитата

Ну наверно нужно посчитать суммарный размер всех файлов, лежащих в этой папке и вложенных в нее папках, а? ;)
_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Weiss
Гость







СообщениеВт, 25-Окт-2005 14:31 
Цитата

Так я это и спросил как посчитать вес всех файлов находящихся в данной папке? чтоб знать скока весит папка... короче напишите хоть как определить скока файл весит какой функцией???
В начало
Пол:Муж aka57
Я живу тут....


Возраст: 28
Знак зодиака: Стрелец
Зарегистрирован: 03.07.2003
Сообщения: 1287

СообщениеВт, 25-Окт-2005 14:39 
Цитата

ключевое слово тут - рекурсия (это по обходу всех файлов в подкаталогах). уже обсуждалось не однократно. и да же (!) я выкладывал где-то тут код. посмотри в поиске. что до размера файла...

например:

Код:

function FileSizeByName(sFilename: string): cardinal;

Parameters

sFilename: string

The file name to be examined.


Returns

Cardinal - Size of the file.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Essentuki
Энтузиаст


Возраст: 27
Знак зодиака: Близнецы
Зарегистрирован: 14.09.2005
Сообщения: 369
Откуда: г Иркутск
СообщениеВт, 25-Окт-2005 18:38 
Цитата

Попробуйте следующий код (он просматривает скрытые, системные, архивные и нормальные файлы, использует рекурсивный алгоритм для просмотра всех вложенных поддиректорий: достаточно указать стартовый каталог и функция возвратит результат в переменной DirBytes, имейте в виду, что для определения типа (файл или директория) код использует функции FileExists и DirectoryExists вместо просмотра атрибутов файла. Причина этого проста - при просмотре CD-ROM функции FindFirst и FindNext иногда заявляют, что файл является каталогом. В коде я обошел эту ошибку. Возвращаемая размерность - байты.):



--------------------------------------------------------------------------------

Код:

    var

DirBytes : integer;

function TFileBrowser.DirSize(Dir:string):integer;
var

SearchRec : TSearchRec;
Separator : string;
begin

if Copy(Dir,Length(Dir),1)='\' then
Separator := ''
else
Separator := '\';
if FindFirst(Dir+Separator+'*.*',faAnyFile,SearchRec) = 0 then begin
if FileExists(Dir+Separator+SearchRec.Name) then begin
DirBytes := DirBytes + SearchRec.Size;
{Memo1.Lines.Add(Dir+Separator+SearchRec.Name);}
end else if DirectoryExists(Dir+Separator+SearchRec.Name) then begin
if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then begin
DirSize(Dir+Separator+SearchRec.Name);
end;
end;
while FindNext(SearchRec) = 0 do begin
if FileExists(Dir+Separator+SearchRec.Name) then begin
DirBytes := DirBytes + SearchRec.Size;
{Memo1.Lines.Add(Dir+Separator+SearchRec.Name);}
end else if DirectoryExists(Dir+Separator+SearchRec.Name) then
begin
if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then begin
DirSize(Dir+Separator+SearchRec.Name);
end;
end;
end;
end;
FindClose(SearchRec);
end; 



_________________
Что не убьет нас сделает сильнее...
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 25-Окт-2005 20:16 
Цитата

to Esentuki

Та-ак, начинаем разбор полетов :)

1. получение последнего символа строки

твой вариант
Код:
Copy(Dir,Length(Dir),1)='\'

нормальный вариант
Код:
Dir[Length(Dir)]


2. проверка, что найден именно каталог
твой вариант
Код:
if DirectoryExists(Dir+Separator+SearchRec.Name) then

нормальный вариант
Код:
if (SearchRec.Attr and faDirectory = faDirectory) then

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеВт, 25-Окт-2005 20:28 
Цитата

to Esentuki
мои тесты показали, что твоя функция работает неоправданно долго и выдает неправильный результат.
я не стал разбираться, что там неправильно, а вместо этого написал правильную функцию.

to All
посмотрите на приведенный ниже код.
только на первый взгляд он кажется оптимальным. :) на самом деле его можно еще больше ускорить, используя вместо типа String тип PChar и api-шные функции FindFirst/FindNext.
Код:
function DirSize(Dir: string): integer;
var
  SearchRec : TSearchRec;
begin
  result:=0;
  if FindFirst(Dir+'\*.*', faAnyFile, SearchRec) = 0 then
  try
    repeat
      if (SearchRec.Attr and faDirectory = faDirectory) then begin
        if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') then
          inc(result, DirSize(Dir + '\' + SearchRec.Name))
      end
      else
        inc(result, SearchRec.Size);
    until FindNext(SearchRec) <> 0;
  finally
    FindClose(SearchRec);
  end;
end;

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж aka57
Я живу тут....


Возраст: 28
Знак зодиака: Стрелец
Зарегистрирован: 03.07.2003
Сообщения: 1287

СообщениеСр, 26-Окт-2005 9:42 
Цитата

Ну что сказать? Красиво :)
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Essentuki
Энтузиаст


Возраст: 27
Знак зодиака: Близнецы
Зарегистрирован: 14.09.2005
Сообщения: 369
Откуда: г Иркутск
СообщениеСр, 26-Окт-2005 18:38 
Цитата

to Ktf
....так начнем разбор ошибок

мои тесты показали, что моя функция работает оправданно Быстро и выдает результат ааабсолютьно верно

......Я аабсолютно не вижу разницы между этой функ и твоей (Которая выдает там чегото лучше чем у меня) тк они полностью одинаковые (ну плюс минус поправка что она с хода писалась)

.....прочит что написано перед моей функ

С наступающими праздниками ESENTUKI

_________________
Что не убьет нас сделает сильнее...
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Пол:Муж dogma
aka Достоевский


Возраст: 27
Знак зодиака: Телец
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
СообщениеЧт, 27-Окт-2005 4:22 
Цитата

НАдо же, у вас еще хватает время на разбор полетов :)))
_________________
Bonum initium est dimidium facti
SQL-задачи (on-line)
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеЧт, 27-Окт-2005 5:31 
Цитата

to Esentuki
моя функция тоже с ходу написана, минут за 10.

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

1. вызов функции сопровождается кучей лишнего кода
т.е. вместо того чтобы просто написать
Код:
  WinntDirSize:=DirSize('c:\winnt');

для вызова твоей функции придется писать так:
Код:
  DirBytes:=0;
  DirSize('c:\winnt');
  WinntDirSize:=DirBytes;

2. в многопоточном приложении об использовании этой функции можно забыть.

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
Пол:Муж Essentuki
Энтузиаст


Возраст: 27
Знак зодиака: Близнецы
Зарегистрирован: 14.09.2005
Сообщения: 369
Откуда: г Иркутск
СообщениеЧт, 27-Окт-2005 18:28 
Цитата

to ktf

не блин когда когда парню никто не помогает это все в порядке, мне особенно разбираться было некогда сколько строчек он там напишет (когда нет ничего, хоть что - это уже дело),.... А когда время работы [быстродействие] сверяют по бабушкиным часам на которых из стрелок только часовая..........

C уважением ESENTUKI

_________________
Что не убьет нас сделает сильнее...
В начало
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Weiss
Гость







СообщениеЧт, 27-Окт-2005 19:27 
Цитата

пацаны не ссорьтесь всем огромное спасибо все очень помогли!!!
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеПт, 28-Окт-2005 5:12 
Цитата

to Esentuki
ага, давай будем предлагать некрасивые решения.

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
MadReason
Гость







СообщениеПт, 28-Окт-2005 12:10 
Цитата

главное правильные выкладывайте
В начало
Показать сообщения:   
Страница 1 из 2 На страницу 1, 2  След.
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100