Форум: "Основная";
Текущий архив: 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