каталоги и файлы

  • Автор темы Sliva
  • Дата начала
Статус
Закрыто для дальнейших ответов.
S

Sliva

#1
Заранее извиняюсь за не очень умный вопрос :) Объясните, пожалуйста, что мы понимаем под каталогом?
 
S

Sliva

#3
А что имеется ввиду под вложенными файлами? И вообще где можно почитать про файлы и каталоги, работу с ними. Скиньте, плиз, ссылку!
 
A

Alex Death

#4
Простите, может я не догоняю.. что за вложенные файлы? Первый раз слышу.
 
S

Shader88

#5
А что имеется ввиду под вложенными файлами? И вообще где можно почитать про файлы и каталоги, работу с ними. Скиньте, плиз, ссылку!
Конкретнее можно сказать что нужно????
С файлами и папками можно работать средствами Delphi(что не советую) а можно через API в Delphi! :)
 
S

Sliva

#6
Мне нужно работать с вкладкой Win32, как я поняла со стандартными функциями типа IsDirNotation, GetDirectoryName...
Вообще задача стоит так:
Есть два каталога. Посчитать общий объем, содержащихся в них файлов. :)
 
S

Shader88

#7
Мне нужно работать с вкладкой Win32, как я поняла со стандартными функциями типа IsDirNotation, GetDirectoryName...
Вообще задача стоит так:
Есть два каталога. Посчитать общий объем, содержащихся в них файлов. :huh:
Как вкладка Win32 соотноситься с файлами и каталогами, я слабо себе представляю..... :)

А так код который определяет размер ВСЕГО каталога:
Код:
var 
DirBytes: Integer;

procedure DirSize(Dir:string);
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 DirBytes := DirBytes + SearchRec.Size
else if DirectoryExists(Dir+Separator+SearchRec.Name) 
then if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') 
then DirSize(Dir+Separator+SearchRec.Name);
while FindNext(SearchRec) = 0 do 
begin
if FileExists(Dir+Separator+SearchRec.Name) 
then DirBytes := DirBytes + SearchRec.Size
else if DirectoryExists(Dir+Separator+SearchRec.Name) 
then if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') 
then DirSize(Dir+Separator+SearchRec.Name);
end;
end;
FindClose(SearchRec);
end;
Для того чтобы определить размер ТОЛЬКО файлов в каталоге
Код:
var
DirBytes: Integer;

procedure DirSize(Dir:string);
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 DirBytes := DirBytes + SearchRec.Size;

while FindNext(SearchRec) = 0 do 
if FileExists(Dir+Separator+SearchRec.Name) 
then DirBytes := DirBytes + SearchRec.Size;
end;
FindClose(SearchRec);
end;
Возвращаемый результат выполнения в БАЙТАХ. Прошу обратить внимание. ;)

Но сразу хочу оговориться, код совсем не оптимизирован!!!!! :unsure:
Поэтому если критично выполнение по времени, то нужно улучшать! :)
 
M

mike.dld

#9
Ай-ай-ай, Shader88... Кто использует для такого случая процедуры и глобальные переменные? В функцию бы это нужно!

Что касается оптимизации:
Код:
function DirSize(Dir:string): integer;
var
SearchRec : TSearchRec;
begin
if not (Dir[Length(Dir)] in ['\','/'])
Dir := Dir + '\';
Result := 0;

if FindFirst(Dir+'*.*',faAnyFile,SearchRec) = 0
then begin
repeat
if SearchRec.Attr and faDirectory <> 0
then inc(Result,DirSize(Dir+SearchRec.Name))
else if SearchRec.Attr and faVolumeID = 0
then inc(Result,SearchRec.Size)
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;
 
S

Shader88

#11
Ай-ай-ай, Shader88... Кто использует для такого случая процедуры и глобальные переменные? В функцию бы это нужно!
МОЛОДЦА!!!! :(

Я просто думал что этот пост больше не кто не читает! Вот и решил проверить! ;)

Конечно, же как функцию....
Даже я больше могу сказать, как мне это кажеться, что девушка занимаеться написанием программы аля WinCommander, просто молчит! :)

Еще раз пасибо! :)
 
S

Sliva

#12
Ну спасибо! :) Это задача на операционные системы. И вот этот цикл:
repeat
if SearchRec.Attr and faDirectory <> 0
then inc(Result,DirSize(Dir+SearchRec.Name))
else if SearchRec.Attr and faVolumeID = 0
then inc(Result,SearchRec.Size)
until FindNext(SearchRec) <> 0;
Он не считает размер вложенных файлов. Видеть их видит, но не считает.
 
S

Sliva

#13
Я так понимаю, что это -
Код:
if FileExists(Dir+Separator+SearchRec.Name) 
then DirBytes := DirBytes + SearchRec.Size
else if DirectoryExists(Dir+Separator+SearchRec.Name) 
then if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') 
then DirSize(Dir+Separator+SearchRec.Name);
while FindNext(SearchRec) = 0 do 
begin
if FileExists(Dir+Separator+SearchRec.Name) 
then DirBytes := DirBytes + SearchRec.Size
else if DirectoryExists(Dir+Separator+SearchRec.Name) 
then if (SearchRec.Name<>'.') and (SearchRec.Name<>'..') 
then DirSize(Dir+Separator+SearchRec.Name);
просто считает размер файлов, которые имеют 1-2 вложенных и их глубина = 1. :)
 
M

mike.dld

#14
Моя вина - не проверил код перед тем как сюда написать. Исправление:
Код:
function DirSize(Dir: string): integer;
var
SearchRec : TSearchRec;
begin
if not (Dir[Length(Dir)] in ['\','/']) then
Dir := Dir + '\';
Result := 0;
if FindFirst(Dir+'*.*',faAnyFile,SearchRec) = 0
then begin
repeat
if (SearchRec.Attr and faDirectory <> 0) and (SearchRec.Name <> '.')
and (SearchRec.Name <> '..')
then inc(Result,DirSize(Dir+SearchRec.Name))
else if SearchRec.Attr and faVolumeID = 0
then inc(Result,SearchRec.Size)
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;
 
B

Barmutik

#15
Такой способ определения размера дирректории будет работать очень долго .. эт его большой минус ...
 
S

Sliva

#16
Я вам очень благодарна! ;) А не подскажите еще как сделать тоже самое, но считая, что два файла, которые даны - это потоки? :unsure:
Понимаете, первый курс... :blink:
 
S

Sliva

#17
Даже не так сформулировала :) Два каталога - это потоки. Help, please!
 
S

Sliva

#20
Тем не менее, задача стоит так. Два каталога - это два потока и с ними надо работать.
 
Статус
Закрыто для дальнейших ответов.