Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.10;
Скачать: CL | DM;

Вниз

Как определить полный размер папки?   Найти похожие ветки 

 
[BAD]Angel ©   (2003-03-28 19:24) [0]

Мастера, не подскажите ли (куском кода):
1. как определить размер папки;
2. узнать дату создания папки;
3. сколько в ней файлов и вложенных папок.

Размер и дата очен нужно, а остальное может и подождать :)

Выручите ПЛЗ!


 
Anatoly Podgoretsky ©   (2003-03-28 19:32) [1]

Все это делается с помощью FindFirst/Next, за исключением пункта 1, поскольку папки не имеют размера.


 
[BAD]Angel ©   (2003-03-28 19:36) [2]

Это все понятно, но как это сделтьа программно? Помогите ПЛЗ!
Я только начинаю программить. :(


 
Anatoly Podgoretsky ©   (2003-03-28 19:41) [3]

На данном сайте есть поиск, по данным словам тебе точно покажет несколько тем, кроме данного сайта с Дельфи поступает справочная системе, поиск по индексу тебе тоже даст несколько тем, с почти готовым кодом. После того как все это посмотришь, приходи уже с конкретными вопросами.
Кроме этих двух слов, в справке надо также посмотреть TSearchRec.


 
Palladin ©   (2003-03-28 19:42) [4]

мда... тебе наверно не подходит Anatoly Podgoretsky © (28.03.03 19:32)
тебе же программно надо...

тогда бери линейку, разбирай винт и меряй...


 
pavel_k   (2003-03-28 19:43) [5]

Если это нужно для отображения то есть прелестный компонент FileListBox. Если так - то только FindFirst/FindNext/FindClose.
Под размером папки подразумевается сумма размеров всех внутренних файлов? Тогда тоже с помощью FindFirst... можно посчитать...


 
[BAD]Angel ©   (2003-03-28 19:51) [6]

блин, какие все умные :(
Нет чтобы помочь человеку. Ищи там, ищи тут... Если я бы искал и нашел, я бы наверное не спрашивал...


pavel_k - мне нужно в label загнать эти три пункта, ты не можешь хоть кусочек кода привести?


 
Palladin ©   (2003-03-28 19:55) [7]


> [BAD]Angel © (28.03.03 19:51)

Не какие все умные, а какой ты не умный
нажми F1
выбери вкладку Index
в строке поиска набери "FindFirst,example"
и подумай...


 
Anatoly Podgoretsky ©   (2003-03-28 19:58) [8]

На тарелочке хочешь, что бы тебе сюда кусок хелпа скопировали, а самому немного ручками поработать нельзя, испачкаются?


 
[BAD]Angel ©   (2003-03-28 20:06) [9]

я же говорю, я НАЧИНАЮЩИЙ...

ФУ - мастера, тоже мне! Все на словах...


 
Palladin ©   (2003-03-28 20:14) [10]

Совет всем НАЧИНАЮЩИМ, учитесь сначала работать со справкой...


 
[BAD]Angel ©   (2003-03-28 20:18) [11]

я в справке не понял :(

Как быдто так сложно объяснить!!!!


 
Palladin ©   (2003-03-28 20:21) [12]

сопоставишь то что написано в примере и то что написал pavel_k (28.03.03 19:43) и поймешь...


 
[BAD]Angel ©   (2003-03-28 20:22) [13]

не получается


 
pavel_k   (2003-03-28 20:37) [14]

Объясняю, вот инфа по Find...(из одного FAQ, первая которая нашлась на скорую руку):


Не правда ли, знакомая ситуация? Необходимо сделать так, чтобы программа искала какой-либо файл... Все, хорошо, если у Вас для этого есть специальная компонента (кстати, не входящая в стандартный набор). А если ее нет? Здесь придется писать алгоритм поиска файла.

В Delphi существует две функции для поиска файлов. Это -

function FindFirst(const Path: string; Attr: Integer; var F: TSearchRec): Integer;
function FindNext(var F: TSearchRec): Integer;

Разберемся, что же означают эти функции. Для начала возьмем первую - FindFirst. Разберемся сначала с переменными.

Path - это переменная, как видно из названия, показывающая путь к директории, где будет производиться поиск файла. Кроме этого, в эту переменную входит также и имя файла (файлов), которые должны быть найдены. Причем, в названии файла можно пользоваться такими символами: * (звездочка) и ? (знак вопроса). Значения этих символов стандартны: знак вопроса - любой допустимый символ, звездочка - комбинация любых допустимых символов. Под допустимыми символами я понимаю символы, которые могут использоваться в операционной системе для обозначения имен файлов.

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


Path:="c:\*.*"; {поиск файлов с любым именем на в корневой директории диска C:}

Path:="e:\audio\song3?.wav"; {поиск файлов в директории E:\AUDIO с именем song3?.wav (это могут файлы, например, song30.wav, song31.wav, song3f.wav и другие)}

Обратите внимание! Недопустимо использовать символы * и ? в названии директории. Эти символы могут использоваться только в имени файла.

Attr - эта переменная задает тип файлов, которые будут найдены. Тип переменной - Integer. Чтобы не мучаться с запоминанием цифр, рекомендую Вам запомнить такие слова:

faReadOnly - файлы, у которых установлен аттрибут "Только для чтения".
faHidden - файлы, у которых установлен атрибут "Скрытые".
faSysFile - файлы, у которых установлен атрибут "Системный".
faArchive - файлы, у которых установлен атрибут "Архивный".
faDirectory - директория. То есть поиск поддиректорий в директории.
faAnyFile - любой файл (в том числе и faDirectory, и faVolumeID).

Теперь с этими словами можно обращаться как с цифрами - складывать их и вычитать. Например:

Attr:=faHidden+faSysFile; {поиск Скрытых и Системных файлов}

Attr:=faAnyFile-faReadOnly; {поиск всех файлов, кроме файлов, имеющих атрибут "Только для чтения"}

Однако учтите, что при применении вычитания результат может получиться несколько неожиданным, поэтому им лучше не злоупотреблять.

Теперь разберемся, что же выдает функция. Функция возвращает 0, если была выполнена успешно, или, в противном случае, код ошибки. Кроме того, если функция нашла файл, удовлетворяющий и условиям переменной Path, и условиям переменной Attr, то она записывает результат в переменную F (типа TSearchRec), которая, естественно, должна быть объявлена командой Var.

Тип TSearchRec можно представить как:

type TSearchRec = Record
Time: Integer;
Size: Integer;
Attr: Integer;
Name: TFileName;
ExcludeAttr: Integer;
FindHandle: THandle;
FindData: TWin32FindData;
end;

Теперь разберемся, что означает функция FindNext.

Если команда FindFirst нашла какой-либо файл, то, возможно, если имя файла задано с символами * и/или ?, есть еще один или несколько файлов, удовлетворяющих условию поиска. В этом случае и используется команда FindNext. Функция также возвращает 0, если была выполнена успешно, или, в противном случае, код ошибки. И также записывает данные в переменную F.

Теперь, зная эти две команды, можно составить и алгоритм поиска заданного файла.

Простейший алгоритм:

Var F: TSearchRec;
Path: String;
Attr: Integer;
begin
Path:="e:\audio\album31\*.wav"; {Искать все файлы в заданной директории с расширение WAV,}
Attr:=faReadOnly+faArchive; {которые имеют атрибуты "Только для чтения" и "Архивный"}

FindFirst(Path,Attr,F);

If F.Name<>"" then begin {Если хотя бы один файл найден, то продолжить поиск}
ListBox1.Items.Add(F.Name); {Добавление в TListBox имени найденного файла}
While FindNext(F)=0 do ListBox1.Items.Add(F.Name);
end;
FindClose(F);
end.

Обратите внимание на процедуру FindClose. Она освобождает память, которую заняли функции FindFirst и FindNext.


 
Anatoly Podgoretsky ©   (2003-03-28 20:46) [15]

[BAD]Angel © (28.03.03 20:18)
Ну если ты с примером не понял и не говоришь что, то рстается только за тебя написать программу, кинь клич в Потрепаться, может кто согласится.


 
[BAD]Angel ©   (2003-03-28 21:51) [16]

Вот что я написал!

tmp1:="c:\myfolder";
if FindFirst(tmp1+"\*", faDirectory, SearchRec) = 0 then begin
while FindNext(SearchRec) = 0 do
a:=a+1;
label8.caption:=inttostr(a)+" элементов";
end;
FindClose(SearchRec);


Он не правильно считает...


 
Anatoly Podgoretsky ©   (2003-03-28 21:54) [17]

Первый элемент в расчет не идет, сразу берется следующий


 
[BAD]Angel ©   (2003-03-28 21:55) [18]

и что?


 
Anatoly Podgoretsky ©   (2003-03-28 21:58) [19]

Ну так откуда будет верный результат.


 
Palladin ©   (2003-03-28 22:01) [20]

как это "и что?", значит он не считается...
и по моему при использовании faDirectory выбираются все файлы...

tmp1:="c:\myfolder";
if FindFirst(tmp1+"\*", faDirectory, SearchRec) = 0 then begin
repeat
a:=a+1;
label8.caption:=inttostr(a)+" элементов";
until FindNext(SearchRec)<>0;
end;
FindClose(SearchRec);



 
ewgeny   (2003-03-28 22:04) [21]

tmp1:="c:\developer";
a:=0;
cnt := 0;
if FindFirst(tmp1+"\*.*", faAnyFile, SearchRec) = 0 then
while FindNext(SearchRec) = 0 do
if (SearchRec.Attr and faDirectory ) = 0 then
begin
inc(a, SearchRec.Size);
inc(cnt);
end;
FindClose(SearchRec);
showmessage( format("Файлов в каталоге %s размер %d",[inttostr(cnt),a]))


 
[BAD]Angel ©   (2003-03-28 22:06) [22]

А разница? :) тоже самое только с REPEAT ... UNTIL


 
Anatoly Podgoretsky ©   (2003-03-28 22:06) [23]

ewgeny (28.03.03 22:04)
Первый элемент не читается!


 
Palladin ©   (2003-03-28 22:07) [24]


> ewgeny (28.03.03 22:04)

и у тебя первую директорию не считает


 
Palladin ©   (2003-03-28 22:08) [25]


> [BAD]Angel © (28.03.03 22:06)

если ты не чувствуешь разницу, то тебе учится и учится...


 
[BAD]Angel ©   (2003-03-28 22:12) [26]

НУ НАЙЧИ!!!

У самих-то ничего не читается


 
[BAD]Angel ©   (2003-03-28 22:13) [27]

ewgeny

Спасибо, помогло!
Но размер что-то не правильно считается :(
А так все ОК!


 
Palladin ©   (2003-03-28 22:17) [28]

не глупи... то что я написал должно посчитать общее количество элементов в папке... (+1 если папка корневая)
если ты добавишь условие ewgeny (28.03.03 22:04)
то посчитаешь количество подпапок...

ЗЫ У меня все прекрасно читается и работает...


 
[BAD]Angel ©   (2003-03-28 22:21) [29]

хорошо!

А как допустим подсчитать отдельно кол-во папок и файлов в myfolder?


 
Anatoly Podgoretsky ©   (2003-03-28 22:32) [30]

Так это уже две переменных FilesCount и DirCountб ну и конечно if then else


 
[BAD]Angel ©   (2003-03-28 23:06) [31]

if FindFirst(tmp1+"\*.*", faAnyFile, SearchRec) = 0 then
while FindNext(SearchRec) = 0 do
if (SearchRec.Attr and faDirectory) = 0 then inc(a) else inc(b);
FindClose(SearchRec);

вот все работает по алгоритму ewgeny
Спасибо большое ewgeny!

А Вы, не могли сразу так сказать :(

Анатолий, а раньше ты мне помогал!


 
Anatoly Podgoretsky ©   (2003-03-28 23:12) [32]

Я же тебе написал else - переводится, если не файл, то папка!


 
Palladin ©   (2003-03-28 23:14) [33]

if FindFirst(tmp1+"\*.*", faAnyFile, SearchRec) = 0 then
while FindNext(SearchRec) = 0 do

вот этот кусок не может работать верно...



Страницы: 1 вся ветка

Текущий архив: 2003.04.10;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.018 c
3-30280
smallll
2003-03-21 19:41
2003.04.10
Как программно добавить/удалить Alias?


7-30617
Mixan
2003-01-26 23:12
2003.04.10
Напишем прогу, моргающую лампочками на клаве в тактTxD и RxD


1-30323
АндрейБ
2003-03-28 14:45
2003.04.10
Отчет в Excel e


3-30262
OneOfTheFew
2003-03-20 13:29
2003.04.10
DELPHI, Paradox и древовидные структуры данных


3-30221
ДмирийК
2003-03-21 14:41
2003.04.10
Проблема с соханением сторки в MS SQL