Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2014, 23:35   #1
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию Посчитать файлы и папки

Как подсчитать количество файлов и папок одной функцией, вот она

Код:
function FileCount(const aFolder: string): Integer;
var
  H: THandle;
  Data: TWin32FindData;
begin
  Result := 0;
  H := FindFirstFile(PCHAR(aFolder + '*.*'), Data);
  if H <> INVALID_HANDLE_VALUE then
    repeat
      Inc(Result, Ord(Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0));
    until
      not FindNextFile(H, Data);
  Windows.FindClose(H);
end;
она считает количество файлов, но если изменить часть кода на это:
Код:
      Inc(Result, Ord(Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0));
где не равно 0 то будет считать поличество папок. А как это объеденить чтобы она подсчитало и то и другое сразу?
HTTqp вне форума Ответить с цитированием
Старый 20.05.2014, 23:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

м.б. так?
Код:
H := FindFirstFile(PCHAR(aFolder + '*.*'), Data);
  if H <> INVALID_HANDLE_VALUE then
    repeat
      Inc(Result);
p.s. не уверен, но мне кажется, что служебные папки с именами "." и ".." тоже подсчитаются. Если что - отфильтруйте их по имени...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.05.2014, 00:11   #3
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
м.б. так?
Код:
H := FindFirstFile(PCHAR(aFolder + '*.*'), Data);
  if H <> INVALID_HANDLE_VALUE then
    repeat
      Inc(Result);
p.s. не уверен, но мне кажется, что служебные папки с именами "." и ".." тоже подсчитаются. Если что - отфильтруйте их по имени...
Прошу прощения я верно не правильно выразился, ме нужно чтобы данная функция однавременно подсчитала и папки и файлы, и я мог например вывести
Код:
ShowMessage('папок'+...+'файлов'+...)
HTTqp вне форума Ответить с цитированием
Старый 21.05.2014, 00:24   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

функция не может возвращать более одного значения (правда, это одно значение может быть структурой или массивом! )

поэтому, можно так поступить:
Код:
procedure FileDirCount(const aFolder: string; var FileCount, DirCount : integer);
var
  H: THandle;
  Data: TWin32FindData;
begin
  FileCount := 0; DirCount  :-= 0;
  H := FindFirstFile(PCHAR(aFolder + '*.*'), Data);
  if H <> INVALID_HANDLE_VALUE then
    repeat
      Inc(FileCount, Ord(Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0));
      if (Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and
            (Data.Name<>'.') and (Data.Name<>'..') then Inc(DirCount);
    until  not FindNextFile(H, Data);
  Windows.FindClose(H);
end;
вызывать:
Код:
var ff, dd : integer;
begin
...
  FileDirCount('C:\WINDOWS\', ff, dd);
  ShowMessage('папок'+IntToStr(dd)+' файлов '+IntToStr(ff));
...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.05.2014, 01:37   #5
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Я бы ещё выкинул нафиг никому не нужную переменную H: THandle;
Код:
if FindFirstFile(PCHAR(aFolder + '*.*'), Data) <> INVALID_HANDLE_VALUE then
northener вне форума Ответить с цитированием
Старый 21.05.2014, 01:58   #6
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Я бы ещё выкинул нафиг никому не нужную переменную H: THandle;
Код:
if FindFirstFile(PCHAR(aFolder + '*.*'), Data) <> INVALID_HANDLE_VALUE then
насколько я знаю она проверяет отсутствие ошибок)
и почему то на (Data.Name<>'.') and (Data.Name<>'..') ругается пишет
[dcc32 Error] Unit1.pas(36): E2008 Incompatible types

Последний раз редактировалось HTTqp; 21.05.2014 в 02:00.
HTTqp вне форума Ответить с цитированием
Старый 21.05.2014, 02:11   #7
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,872
По умолчанию

Цитата:
насколько я знаю она проверяет отсутствие ошибок)
Она, то бишь переменная H: THandle; ничего проверять не может в принципе. Ну это как общеизвестное "он же памятник! Кто ж его посадит!". Проверять можешь только ты, написав код для такой проверки.
northener вне форума Ответить с цитированием
Старый 21.05.2014, 09:17   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Я бы ещё выкинул нафиг никому не нужную переменную H: THandle;
Код:
if FindFirstFile(PCHAR(aFolder + '*.*'), Data) <> INVALID_HANDLE_VALUE then
во-первых, не учите плохому!
во-вторых, у и как Вы напишете продолжение поиска - процедуру FindNext, расскажите, пожалуйста.


Цитата:
и почему то на (Data.Name<>'.') and (Data.Name<>'..') ругается пишет
[dcc32 Error] Unit1.pas(36): E2008 Incompatible types
ну да, мой косячок, конечно. это же WinAPI, тут структура чуток другая.

Попробуйте так:
Код:
if (Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and
            (Data.cFileName<>'.') and (Data.cFileName<>'..') then Inc(DirCount);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.05.2014, 15:35   #9
HTTqp
Форумчанин
 
Регистрация: 20.12.2013
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
во-первых, не учите плохому!
во-вторых, у и как Вы напишете продолжение поиска - процедуру FindNext, расскажите, пожалуйста.



ну да, мой косячок, конечно. это же WinAPI, тут структура чуток другая.

Попробуйте так:
Код:
if (Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and
            (Data.cFileName<>'.') and (Data.cFileName<>'..') then Inc(DirCount);
увы, не то)
HTTqp вне форума Ответить с цитированием
Старый 21.05.2014, 16:46   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
procedure FileDirCount(const aFolder: string; var FileCount, DirCount : integer);
var
  H: THandle;
  Data: TWin32FindData;
  Dir : string;
begin
  FileCount := 0; DirCount  := 0;
  Dir := IncludeTrailingBackslash(aFolder);
  H := FindFirstFile(PCHAR(Dir + '*.*'), Data);
  if H <> INVALID_HANDLE_VALUE then
    repeat
      Inc(FileCount, Ord(Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0));
      if (Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and
        (String(Data.cFileName)<>'.') and (String(Data.cFileName)<>'..') then Inc(DirCount);
    until  not FindNextFile(H, Data);
  Windows.FindClose(H);
end;


procedure TForm6.Button1Click(Sender: TObject);
var ff, dd : integer;
begin
  FileDirCount(Edit1.Text, ff, dd);
  ShowMessage('В каталоге '+ Edit1.Text+ ' папок '+IntToStr(dd)+' файлов '+IntToStr(ff));
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Папки и файлы в директории саша40 Общие вопросы Delphi 19 08.01.2024 18:34
С++ Программа : Нужно посчитать сколько раз встречается в отдельном файле данной папки вписанное слово ил Jurek Общие вопросы C/C++ 7 20.04.2014 22:12
Папки и файлы SUPER123 Win Api 8 04.09.2013 15:18
Посчитать файлы AK55 Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 0 04.06.2013 20:55
Файлы и папки X@OC Общие вопросы Delphi 2 13.09.2011 21:18