Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

проблема с подсчетом размера директории

12K
10 ноября 2007 года
Apelsin
21 / / 06.07.2006
Нужна помощь!
Написал функцию, которая подсчитывает размер ее.
Проблема вот в чем, на некоторых директориях типа c:\\windows ее результат сильно отличается от, того что показывается в эксплорере. А на других результат совпадает, причем проверял и с несколькими поддиректориями и с различной структурой.

Может кто-нибудь сталкивался с этим или знает в чем дело?

вот код. Размер записывается в глобальную переменную __int64 i64Size
Код:
#define _WIN32_WINNT 0x0501

#include <iostream>
#include <list>
#include <vector>
#include <string>
#include <windows.h>
#include <winbase.h>
#include <io.h>
#include <stack>

__int64 i64Size;

void FolderSize(std::string sFolder)
{
    WIN32_FIND_DATA fileinfo;
    HANDLE hFind;
    int length;
    static std::stack<std::string> FolderWay;
    FolderWay.push(sFolder);
    std::string sFolderTemp;
   
    sFolderTemp = FolderWay.top() + "\\*.*";

    hFind = FindFirstFile(sFolderTemp.c_str(), &fileinfo);;
    if(hFind != INVALID_HANDLE_VALUE)
    {
        do {
            //Если то что мы нашли не является обратными ссылками...
            if(((strcmp(fileinfo.cFileName, ".") != 0) &&  (strcmp(fileinfo.cFileName, "..") != 0)))
            {
                // если папка
                if(fileinfo.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
                {
                    sFolderTemp = FolderWay.top() + "\\" + fileinfo.cFileName;
                    FolderSize(sFolderTemp.c_str());
                }
                else //Если это файл - прибавляем его размер к общему размеру
                {
                    i64Size += fileinfo.nFileSizeLow;
                   
                };
            };
        } while(FindNextFile(hFind, &fileinfo) != 0);  

    }
    else
    {
        return;
    };
    FindClose(hFind);
    FolderWay.pop();
}

void main(void)
{
    i64Size = 0;
    FolderSize("C:\\windows");
    std::cout << i64Size;
}
489
10 ноября 2007 года
NeO_u
277 / / 11.10.2006
Меня смутило, почему прибавляется только nFileSizeLow? а как же nFileSizeHigh?
Выдержка из БДН:
nFileSizeHigh
The high-order DWORD value of a file size, in bytes.
This value is 0 (zero) unless the file size is greater than MAXDWORD.

The size of the file is equal to (nFileSizeHigh * (MAXDWORD+1)) + nFileSizeLow.

nFileSizeLow
The low-order DWORD value of the file size, in bytes.
12K
11 ноября 2007 года
Apelsin
21 / / 06.07.2006
поправил, но дело не в этом. Такое ощущение что функция проходиться не по всем файлам, все никак не могу найти по каким. ((
489
11 ноября 2007 года
NeO_u
277 / / 11.10.2006
Цитата: Apelsin
поправил, но дело не в этом. Такое ощущение что функция проходиться не по всем файлам, все никак не могу найти по каким. ((



Для того что бы понять по каким файлам не проходится, существует дебаггер:-)

1.6K
11 ноября 2007 года
Vov4ick
476 / / 01.02.2007
Посмотри справку по функциям поиска. они могут не проходиться по файлам с некоторыми атрибутами (например, скрытый), для этого нужно задавать атрибут поиска.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог