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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2011, 03:19   #1
epickgod
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 19
Восклицание Подсчет кол-во файлов в папке

Знающие, подскажите, как сделать подсчет файлов (только *.jpg *.jpeg *.bmp *.tif *.tiff !!!) в папке. Вот код, которые подсчитывает кол-во ВСЕХ файлов в папке
Код:
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;
epickgod вне форума Ответить с цитированием
Старый 16.10.2011, 15:41   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, например, так:
Код:
function FileCount4FExt(const aFolder: string): Integer;
var
  H: THandle;
  Data: TWin32FindData;
begin
  Result := 0;
  H := FindFirstFile(PCHAR(IncludeTrailingBackslash(aFolder) + '*.*'), Data);
  if H <> INVALID_HANDLE_VALUE then
    repeat
      if ((Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0) then begin
        if (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.JPG') or
           (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.JPEG') or
           (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.BMP') or
           (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.TIF') or
           (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.TIFF') then
        Inc(Result);
      // Inc(Result, Ord(Data.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0));
      end;
    until not FindNextFile(H, Data);
  Windows.FindClose(H);
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2011, 15:34   #3
epickgod
Пользователь
 
Регистрация: 04.10.2011
Сообщений: 19
По умолчанию

спасибо, вечером проверю)
epickgod вне форума Ответить с цитированием
Старый 17.10.2011, 16:30   #4
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Код:
 if (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.JPG') or
           (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.JPEG') or
           (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.BMP') or
           (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.TIF') or
           (AnsiUpperCase(ExtractFileExt(Data.cFileName))='.TIFF') then
Сергей, когда нужно сравнивать строку из многими вариантами, я делаю вот так:
Код:
const 
  cMask = '?.JPG?.JPEG?.BMP?.TIF?.TIFF';
  if Pos('?'+AnsiUpperCase(ExtractFileExt(Data.cFileName)), cMask)>0 then
  найдено
Очень хороший метод. В примере я поставил ? (невозможный для файловой системы символ) для того чтобы находило наверняка вещи типо .TIF .TIFF
Иногда, требуется сопоставить строке индекс. Тогда
Код:
 cMask = '01?.JPG22?.JPEG07?.BMP09?.TIF03?.TIFF';
....
 p:=Pos('?'+AnsiUpperCase(ExtractFileExt(Data.cFileName)), cMask);
 if p>0 then
  index :=  StrToInt(Copy(cMask, p-2,2));
Не спорю про Ваш метод, он рабоч, но условие будет перебирать 5 раз AnsiUpperCase и ExtractFileExt. что притормаживает работу цыкла при количестве файлов в несколько тысяч (например папака с иконками или картинками со свадьбы)))
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 17.10.2011, 17:04   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Очень хороший метод. В примере я поставил ? (невозможный для файловой системы символ)
угу. не спорю. Полностью согласен!
Можно и так.

я, когда писал пример, хотел все расширения затолкать в TStringList и проверять их наличие поиском. Но потом решил, что для 5-ти расширений - это сильно жирно будет...

Чтобы избежать многократного вызова я обычно завожу доп.переменную:
sTemp := AnsiUpperCase(ExtractFileExt(Data.c FileName));
и потом уже с ней работаю. (сравниваю, ищу и т.д. и т.п.)

Впрочем, подходом с поиском в строке тоже часто пользуюсь.
Это действительно простой, надёжный и быстрый способ.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2011, 17:26   #6
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Цитата:
Чтобы избежать многократного вызова я обычно завожу доп.переменную:
Согласен. В некоторых случаях дополнительная переменная посто необходима для читабильности текста
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
подсчет количества файлов в папке aldeano Microsoft Office Excel 1 09.06.2011 16:12
Подсчет кол-ва строк в excel Доктор Microsoft Office Excel 6 11.12.2010 13:46
Подсчитать кол-во файлов в папке! sashahttp Win Api 1 01.04.2010 12:38
Подсчет кол-ва значений в строке new_user БД в Delphi 1 03.06.2009 09:18
Отслеживает появление в папке файлов. слежение за определенным файлом в определенной папке. RammFan Win Api 1 09.06.2007 11:09