Нужно с помощью ф-ий WinAPI вычислить объем папки и кол-во вложенных в неё папок.
Может у кого есть уже по этому примеры? А то я чего-то запарился, рекурсия почему-то по всему дереву папок не пробегает...
Здравствуйте, I_am_Foror, Вы писали:
I__>Нужно с помощью ф-ий WinAPI вычислить объем папки и кол-во вложенных в неё папок.
I__>Может у кого есть уже по этому примеры? А то я чего-то запарился, рекурсия почему-то по всему дереву папок не пробегает...
А может ты её плохо покормил

.
Если серьёзно, чё там может не пробегать. Задача элементарная, если фалл — плюсуешь размер, если папка — вызываешь для неё рекурсивно. Можт ты путь к папкам не так клеишь? Кинь код поправим, а с нуля писать влом.
Даже самую простую задачу можно сделать невыполнимой, если провести достаточное количество совещаний
Здравствуйте, I_am_Foror, Вы писали:
I__>Нужно с помощью ф-ий WinAPI вычислить объем папки и кол-во вложенных в неё папок.
I__>Может у кого есть уже по этому примеры? А то я чего-то запарился, рекурсия почему-то по всему дереву папок не пробегает...
Такое случается из-за того, что при рекурсивном переходе функции самой в себя ты забиваешь старые параметры поиска новыми, соответственно при выходе из функции ты оказываешься в тебе ненужном состоянии. Я эту проблему решал созданием класса поиска. Ниже примерный код (т.к. С++ не стоит буду писать "из головы", а посему, просьба не пинать

)
class Finder
{
public:
void ListOf(char *);
}
void Finder::ListOf(char *root, char *wildcard, HANDLE fHandle;)
{
char path[MAX_PATH];
char templ = "%s\\%s";
WIN32_FIND_DATA ffdata
HANDLE hFind;
if( root )
{
sprintf(path, templ, root, wildcard);
hFind = FindFirstFile( path, &ffdata );
}
else
{
hFind = fHandle;
}
while( FindNextFile(hFind, &ffdata) )
{
if( ffdata.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY && ffdata.cFileName[0] !='.')
{
Finder *newFinder = new Finder;
sprintf(path, templ, ffdata.cFileName, wildcard);
newFinder->ListOf(NULL, path, &ffdata );
delete mewFinder;
}
}
printf("Найдено: %s\n", ffdata.cFileName);
}
Ну в общем, что-то в этом роде.

Конечно прийдется немного подравить по своим нуждам, да и ошибочки могут быть, но главное что идея понятна
С регардами.
Здравствуйте, I_am_Foror, Вы писали:
Ну к примеру...
class CRecursiveFileEnumerator
{
protected:
virtual void Process ( const char * fullname, LPWIN32_FIND_DATA fd ) = 0;
public:
int Go ( const char * _file );
};
int CRecursiveFileEnumerator::Go ( const char * _file )
{
WIN32_FIND_DATA FindFileData;
char szFilePath [ MAX_PATH ];
int bname;
strcpy ( szFilePath, _file );
if ( szFilePath [ strlen (szFilePath) - 1 ] != '\\' )
{
strcat ( szFilePath, "\\" );
}
bname = strlen ( szFilePath );
strcat ( szFilePath, "*.*" );
HANDLE hFind = ::FindFirstFile ( szFilePath, &FindFileData );
if ( hFind != INVALID_HANDLE_VALUE )
{
do
{
strcpy ( szFilePath+bname, FindFileData.cFileName );
if ( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
{
if ( (0 != strcmp(FindFileData.cFileName, ".") )
&& (0 != strcmp(FindFileData.cFileName, "..") )
)
{
Process ( szFilePath, &FindFileData );
Go ( (const char *) szFilePath );
}
}
else
{
Process ( szFilePath, &FindFileData );
}
}
while ( ::FindNextFile ( hFind, &FindFileData ) );
::FindClose ( hFind );
return 0;
}
return 1;
}
Наследуешься от CRecursiveFileEnumerator, перегружаешь Process(), запускаешь Go(...)
--
BR, Kam