| Автор
| Сообщение |
|
|
|
Цитата |
|
| Подскажите пожалюста как можно узнать размер папки... |
|
| В начало |
|
 |
|
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
Ну наверно нужно посчитать суммарный размер всех файлов, лежащих в этой папке и вложенных в нее папках, а?  _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| Так я это и спросил как посчитать вес всех файлов находящихся в данной папке? чтоб знать скока весит папка... короче напишите хоть как определить скока файл весит какой функцией??? |
|
| В начало |
|
 |
 aka57
Я живу тут....

Возраст: 28
Знак зодиака: 
Зарегистрирован: 03.07.2003
Сообщения: 1287
|
|
|
Цитата |
|
ключевое слово тут - рекурсия (это по обходу всех файлов в подкаталогах). уже обсуждалось не однократно. и да же (!) я выкладывал где-то тут код. посмотри в поиске. что до размера файла...
например:
| Код: |
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
Откуда: г Иркутск
|
|
|
Цитата |
|
Попробуйте следующий код (он просматривает скрытые, системные, архивные и нормальные файлы, использует рекурсивный алгоритм для просмотра всех вложенных поддиректорий: достаточно указать стартовый каталог и функция возвратит результат в переменной 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;
|
_________________ Что не убьет нас сделает сильнее... |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
to Esentuki
Та-ак, начинаем разбор полетов
1. получение последнего символа строки
твой вариант
| Код: | | Copy(Dir,Length(Dir),1)='\' |
нормальный вариант
2. проверка, что найден именно каталог
твой вариант
| Код: | | if DirectoryExists(Dir+Separator+SearchRec.Name) then |
нормальный вариант
| Код: | | if (SearchRec.Attr and faDirectory = faDirectory) then |
_________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
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
|
|
|
Цитата |
|
Ну что сказать? Красиво  |
|
| В начало |
|
 |
 Essentuki
Энтузиаст

Возраст: 27
Знак зодиака: 
Зарегистрирован: 14.09.2005
Сообщения: 369
Откуда: г Иркутск
|
|
|
Цитата |
|
to Ktf
....так начнем разбор ошибок
мои тесты показали, что моя функция работает оправданно Быстро и выдает результат ааабсолютьно верно
......Я аабсолютно не вижу разницы между этой функ и твоей (Которая выдает там чегото лучше чем у меня) тк они полностью одинаковые (ну плюс минус поправка что она с хода писалась)
.....прочит что написано перед моей функ
С наступающими праздниками ESENTUKI _________________ Что не убьет нас сделает сильнее... |
|
| В начало |
|
 |
|
|
 |
 dogma
aka Достоевский

Возраст: 27
Знак зодиака: 
Зарегистрирован: 20.12.2004
Сообщения: 1702
Откуда: Холмск
|
|
|
Цитата |
|
НАдо же, у вас еще хватает время на разбор полетов )) _________________ Bonum initium est dimidium facti
SQL-задачи (on-line) |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
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
Откуда: г Иркутск
|
|
|
Цитата |
|
to ktf
не блин когда когда парню никто не помогает это все в порядке, мне особенно разбираться было некогда сколько строчек он там напишет (когда нет ничего, хоть что - это уже дело),.... А когда время работы [быстродействие] сверяют по бабушкиным часам на которых из стрелок только часовая..........
C уважением ESENTUKI _________________ Что не убьет нас сделает сильнее... |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| пацаны не ссорьтесь всем огромное спасибо все очень помогли!!! |
|
| В начало |
|
 |
 Ktf
Администратор

Возраст: 32
Знак зодиака: 
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
|
|
|
Цитата |
|
to Esentuki
ага, давай будем предлагать некрасивые решения. _________________ Пойду посплю перед сном. |
|
| В начало |
|
 |
|
|
|
Цитата |
|
| главное правильные выкладывайте |
|
| В начало |
|
 |
|