#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;
}
проблема с подсчетом размера директории
Написал функцию, которая подсчитывает размер ее.
Проблема вот в чем, на некоторых директориях типа c:\\windows ее результат сильно отличается от, того что показывается в эксплорере. А на других результат совпадает, причем проверял и с несколькими поддиректориями и с различной структурой.
Может кто-нибудь сталкивался с этим или знает в чем дело?
вот код. Размер записывается в глобальную переменную __int64 i64Size
Код:
Выдержка из БДН:
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.
поправил, но дело не в этом. Такое ощущение что функция проходиться не по всем файлам, все никак не могу найти по каким. ((
Цитата: Apelsin
поправил, но дело не в этом. Такое ощущение что функция проходиться не по всем файлам, все никак не могу найти по каким. ((
Для того что бы понять по каким файлам не проходится, существует дебаггер:-)
Посмотри справку по функциям поиска. они могут не проходиться по файлам с некоторыми атрибутами (например, скрытый), для этого нужно задавать атрибут поиска.