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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2013, 21:24   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Узнать размер папки - есть ли аналог GetFileSize?

Нужно получить размер каталога на С++, есть код с TSearchRec типа такого:
Код:
    __int64 GetFolderSize(AnsiString SrcPath)
    {
    TSearchRec SR;
    __int64 Result = 0;
     if (FindFirst(SrcPath + "\\*", faAnyFile, SR) == 0)
     {
       do
       {
         if ((SR.Name != ".")&&(SR.Name != ".."))
           if (SR.Attr == faDirectory)
             Result = Result + GetFolderSize(SrcPath +"\\"+ SR.Name);
           else
             Result = Result + SR.Size;
       }while(FindNext(SR) == 0);
       FindClose(SR);
     }
     return Result;
    }
На мой взгляд,способ очень дубовый и не современный.
Можно ли сделать более оптимизировано на WinAPI,типа GetFileSize?
Пишу в Embarcadero XE2 C++ Builder
calypso вне форума Ответить с цитированием
Старый 05.06.2013, 06:56   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от calypso Посмотреть сообщение
Можно ли сделать более оптимизировано на WinAPI,типа GetFileSize?
Нет, такого API нет.
waleri вне форума Ответить с цитированием
Старый 06.06.2013, 20:41   #3
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

Получается опять что без рекурсии не обойтись,ибо код судя по всему тупо суммирует размер всех-всех файлов в каталоге.
Тот код который я написал (на самом деле украл с другого сайта) глючный.Вот примерно что должно быть:
1 вариант
Код:
    DWORDLONG GetFolderSize(AnsiString SrcPath)
    {
    TSearchRec SR;
    DWORDLONG Result = 0;
     if(FindFirst(SrcPath + "\\*.*", faAnyFile, SR) == 0)
     {
       do
       {
         if((SR.Name != ".")&&(SR.Name != ".."))
           if(SR.Attr & faDirectory)
             Result = Result + GetFolderSize(SrcPath +"\\"+ SR.Name);
           else
             Result = Result + ((DWORDLONG)SR.FindData.nFileSizeHigh<<32) + SR.FindData.nFileSizeLow;
       }while(FindNext(SR) == 0);
     }
     FindClose(SR);
     return Result;
    }
2 вариант
Код:
    DWORDLONG GetFolderSize2(AnsiString SrcPath)
    {
      HANDLE Handle;
      WIN32_FIND_DATA FindData;
      DWORDLONG Result=0;
     
      Handle = FindFirstFile((SrcPath+"\\*.*").c_str(), &FindData);
      if (Handle == INVALID_HANDLE_VALUE){
       RaiseLastOSError;
       return 0;}
     
      do
      {
        if((AnsiString(FindData.cFileName) != ".")&&(AnsiString(FindData.cFileName) != ".."))
          if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            Result = Result + GetFolderSize2(SrcPath+"\\"+AnsiString(FindData.cFileName));
          else
            Result = Result + ((DWORDLONG)FindData.nFileSizeHigh<<32) + FindData.nFileSizeLow;
      }while(FindNextFile(Handle, &FindData) != 0);
      FindClose(Handle);
      return Result;
    }
calypso вне форума Ответить с цитированием
Старый 06.06.2013, 21:45   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от calypso Посмотреть сообщение
На мой взгляд,способ очень дубовый и не современный.
Можно ли сделать более оптимизировано на WinAPI,типа GetFileSize?
А зачем?
Для файлов GetFileSize нужно, чтобы знать, в каком диапазоне делать SetFilePointer, либо сколько памяти выделять для загрузки файла.

Впрочем, боюсь, следующим вопросом будет: как сделать SetFilePointer по папке?

Последний раз редактировалось s-andriano; 06.06.2013 в 21:48.
s-andriano вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Узнать имя папки terpyohok Общие вопросы Delphi 6 06.11.2012 13:10
Размер папки windows 7 maksat-15 Операционные системы общие вопросы 1 30.12.2011 01:49
Есть окно, в котором есть аналог Memo. Как из него вытащить текст? TwiX Общие вопросы Delphi 6 16.06.2011 13:58
как програамно узнать размер папки VIR1435 Общие вопросы Delphi 2 05.11.2009 18:06
Как найти размер папки! vitalik007 Общие вопросы Delphi 6 02.02.2008 14:29