Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.190.156.212] |
|
Сообщ.
#1
,
|
|
|
Добрый день!
Программа должна находить первые 10 файловв текущем каталоге,и первом уровне подкаталогов через сеткаррентдиректори. Проблема возникает ,если в текущей директории и первом подкаталоге в общем меньше 10,нет выхода из первого подкаталога(крутится там),и нет перехода в следующий подкаталог и дувайл,ваил мне здесь не помогает. Если кто может помочь с тем чтоб поиск продолжался и по другим директориям,то заранее спасибо. int main() { //searchAll(); fileCreate(); SetCurrentDirectory("D:\\"); if (hFind != INVALID_HANDLE_VALUE) { search(); } //poisk v papke hFindAll = FindFirstFile("*.*", &FindFileData); if ((hFindAll != INVALID_HANDLE_VALUE) && (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (counter < 10)) { while (FindNextFile(hFindAll, &FindFileData) && (counter < 10)) { SetCurrentDirectory(FindFileData.cFileName); GetCurrentDirectory(sizeof(buffer), buffer); cout << "After change : " << buffer << endl; search();//poisk v papke cout << "Loop if finished" << endl; } } FindClose(hFindAll); CloseHandle(hFile); readHTML(); system("pause"); return 0; } cкрин вывода Прикреплённая картинка
|
Сообщ.
#2
,
|
|
|
Может надо что-то вида:
{ GetCurrentDirectory( len, временная); // куда вернуться SetCurrentDirectory(FindFileData.cFileName); // заход ... search(); ... SetCurrentDirectory(временная); //возврат } |
Сообщ.
#3
,
|
|
|
Славян
СПАСИБО. Попробовал. Уже лучше ,возвращается откуда зашёл,но перехода в следующую нет.ПОлдела сделано.:-) int main() { //searchAll(); fileCreate(); SetCurrentDirectory("D:\\"); if (hFind != INVALID_HANDLE_VALUE) { search(); }//search in basic folder hFindAll = FindFirstFile("*.*", &FindFileData); if ((hFindAll != INVALID_HANDLE_VALUE) && (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (counter < 10)) { while (FindNextFile(hFindAll, &FindFileData) && (counter < 10)) { GetCurrentDirectory(sizeof(bufferTemp), bufferTemp); SetCurrentDirectory(FindFileData.cFileName); GetCurrentDirectory(sizeof(buffer), buffer); cout << "After change : " << buffer << endl; search(); SetCurrentDirectory(bufferTemp); cout << "Loop if finished" << endl; } } FindClose(hFindAll); CloseHandle(hFile); readHTML(); system("pause"); return 0; } Прикреплённая картинка
|
Сообщ.
#4
,
|
|
|
Хм-м... наверное, не нужны были эти заходы да возвраты! Что-то такое получше:
while( FindNextFile(hFindAll, &FindFileData) && counter<10 ) { //GetCurrentDirectory(sizeof(bufferTemp), bufferTemp); if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) SetCurrentDirectory(FindFileData.cFileName); // сменим путь, если нам попался каталог! GetCurrentDirectory(sizeof(buffer), buffer); ... } Добавлено Хотя может получиться, что заходим в каталог, а потом идём в текущий ("."), а затем сразу выходим (".."). Короче, надо после очередного захода в каталог искать токмо с атрибутом НЕ КАТАЛОГ! |
Сообщ.
#5
,
|
|
|
Славян
Спасибо.Не помогло ,тогда зацикливание остается ,не ифы в ваиле не помогают. Точка сохранения дает выйти из вайла.Но вот что делать дальше. И атрибут директориии прописан в ифе выше ,над вайлом. |
Сообщ.
#6
,
|
|
|
Смотрите, какая схема для вашего случая:
1. Ищем в заданном ТОЛЬКО файлы. 2. Далее, ищем ТОЛЬКО каталоги (если файлов менее 10 оказалось). 3. Заходим в каждый каталог, заранее запомнив точку захода. 4. Ищем снова в найденном ТОЛЬКО файлы. 5. Выходим, зная точку входа. И идём в п.2 Так, у вас получится в точности ваше задание. |
Сообщ.
#7
,
|
|
|
Славян
Вы абсолютно правы и абсолютно правильно всё поняли. Но это почему то не работает int main() { fileCreate(); SetCurrentDirectory("D:\\"); if (hFind != INVALID_HANDLE_VALUE) { search(); }//search in basic folder hFindAll = FindFirstFile("*.*", &FindFileData); if ((hFindAll != INVALID_HANDLE_VALUE) && (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && (counter < 10)) { while (FindNextFile(hFindAll, &FindFileData) && (counter < 10)) { GetCurrentDirectory(sizeof(bufferTemp), bufferTemp);//save tocki vhoda SetCurrentDirectory(FindFileData.cFileName);//enter GetCurrentDirectory(sizeof(buffer), buffer); cout << "After change : " << buffer << endl; search(); SetCurrentDirectory(bufferTemp);//back to save cout << "Loop is finished" << endl; } } FindClose(hFindAll); CloseHandle(hFile); readHTML(); system("pause"); return 0; } void search() { hFind = FindFirstFile("*.jpg*", &FindFileData); do { if (counter < 10) { FileTimeToSystemTime(&FindFileData.ftCreationTime, &SystemTime); printf("%s\t %d.%d.%d \n", FindFileData.cFileName, SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear); WriteFile(hFile, &FindFileData, sizeof(WIN32_FIND_DATA), &nb, NULL); counter++; } } while (FindNextFile(hFind, &FindFileData)); FindClose(hFind); } Прикреплённая картинка
|
Сообщ.
#8
,
|
|
|
Ну так потому что у вас одна схема на всё! Сделайте 3 схемы, как я описал в пунктах (чтобы каждую можно было отладить, и убедиться, что работает) :
1-я) Ищет ТОЛЬКО файлы в заданном каталоге. 2-я) перебирает ТОЛЬКО каталоги. 3-я) ищет ТОЛЬКО файлы в каталоге, куда зашли из схемы №2. И всего делов! Т.е. вам понадобится ДВЕ маски типа WIN32_FIND_DATA - одна для поиска каталогов, вторая - только для файлов. П.С. 1) у вас же (в search) не видно разделения на файлы/каталоги, т.е. каталог TEST.JPG всё равно будет найден же и сосчитан?! Что неверно! 2) "if (counter < 10)" лучше вытащить перед вызовом search, а в том while убрать это в условие: if (counter < 10) search(); ... do { FileTimeToSystemTime(&FindFileData_Files.ftCreationTime, &SystemTime); printf("%s\t %d.%d.%d \n", FindFileData_Files.cFileName, SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear); WriteFile(hFile, &FindFileData_Files, sizeof(WIN32_FIND_DATA), &nb, NULL); counter++; }while( counter<10 && FindNextFile(hFind, &FindFileData_Files) ); |
Сообщ.
#9
,
|
|
|
Славян
Большое спасибо! Попробую это исправить.Если получится. Search поправил ,с остальным пробую реализовать. |
Сообщ.
#10
,
|
|
|
Да, что-то тут не так. Виноват. У вас же всё равно идёт возврат в D:\ и система заново перебирает уже найденные файлы. Надо подумать.
|
Сообщ.
#11
,
|
|
|
Славян
Спасибо что помогаете.Я уже 4 дня с этим парюсь........... Осталась какая то мелочь на виду...но вот что именно... А может не выход а переход на след директорию или выход и вход в следующую,но как войти в следующую.. Может как то смену директории в цикл загнать.. |
Сообщ.
#12
,
|
|
|
У меня вот так ваша схема заработала:
#include <stdio.h> #include <windows.h> #include <iostream> WIN32_FIND_DATAW FindFileData; unsigned counter = 0; wchar_t bufferTemp[600], buffer[500]; SYSTEMTIME SystemTime; void search() { HANDLE hFind = FindFirstFile(L"*.exe*", &FindFileData); if( hFind != INVALID_HANDLE_VALUE ) { do { if (counter < 30 && (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE) ) { FileTimeToSystemTime(&FindFileData.ftCreationTime, &SystemTime); wprintf(L"%s\t %d.%d.%d \n", FindFileData.cFileName, SystemTime.wDay, SystemTime.wMonth, SystemTime.wYear); // WriteFile(hFile, &FindFileData, sizeof(WIN32_FIND_DATA), &nb, NULL); counter++; } }while( FindNextFile(hFind, &FindFileData) ); FindClose(hFind); } } int main() { SetCurrentDirectory(L"F:\\"); HANDLE hFindAll; search();//search in basic folder hFindAll = FindFirstFile(L"*.*", &FindFileData); if( hFindAll != INVALID_HANDLE_VALUE && counter<30 ) do { //while( FindNextFile(hFindAll, &FindFileData) && (counter < 30) ) if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { GetCurrentDirectory(sizeof(bufferTemp), bufferTemp);//save tocki vhoda if( SetCurrentDirectory(FindFileData.cFileName) )//enter { GetCurrentDirectory(sizeof(buffer), buffer); std::cout << "After change : " << buffer << std::endl; search(); SetCurrentDirectory(bufferTemp);//back to save std::cout << "Loop is finished" << std::endl; } } }while( FindNextFile(hFindAll, &FindFileData) ); FindClose(hFindAll); //CloseHandle(hFile); } |
Сообщ.
#13
,
|
|
|
Славян
Спасибо попробую |
Сообщ.
#14
,
|
|
|
amigot, на тебе работающую заготовочку, но она только для С++17:
#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; const int MAX_D_LEVEL = 3; // как глубоко сканировать структуру каталогов const int MAX_D_COUNT = 3; // какое максимальное количество каталогов проходить в текущем const int MAX_F_COUNT = 4; // какое максимальное количество файлов учитывать в текущем void SearchFiles(std::string iDir, int iLevel) { int DCnt = 0; int FCnt = 0; std::cout << "d: " << iDir << std::endl; for(auto& p: fs::directory_iterator(iDir)) { if (p.is_directory()) { if ((iLevel+1 == MAX_D_LEVEL) || (DCnt == MAX_D_COUNT) || (p.path().filename() == ".") || (p.path().filename() == "..")) continue; SearchFiles(iDir+"\\"+p.path().filename().u8string(), iLevel+1); DCnt++; continue; } if (p.is_regular_file()) { if (FCnt == MAX_F_COUNT) continue; std::cout << "f: " << iDir << "\\" << p.path().filename().u8string() << std::endl; FCnt++; } } } int main() { SearchFiles("C:\\Temp",0); return 0; } |
Сообщ.
#15
,
|
|
|
Славян
Спасибо! За помощь ! Заработало!!!!!!!!!!!!!!!!!!!!!!!!!!! Ура!!!!!!!!!!!!!! |