Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.10;
Скачать: [xml.tar.bz2];

Вниз

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

 
[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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.015 c
1-30386
Provodnick
2003-03-30 00:52
2003.04.10
Пара вопросов о таймере и о дереве каталогов...


3-30235
LazorenkoX
2003-03-21 00:05
2003.04.10
date


8-30462
Новичек
2003-01-04 13:57
2003.04.10
Можно ли проиграть Wave-файл без применения MediaPlayer?


3-30278
Сергей
2003-03-18 14:35
2003.04.10
SQL таблицы. Реализация.


1-30431
klyonov
2003-03-29 08:27
2003.04.10
Насчет Drag&Dock





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский