|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » WinApi||посчитать сколько файлов и папок на диске |
|
|
WinApi||посчитать сколько файлов и папок на диске
|
Пользователь Сообщения: 68 |
Профиль | Отправить PM | Цитировать
Здравствуйте. Подскажите пожалуйста, почему у меня при подсчете кол-ва файлов и папок на диске это количество не соответствует действительности.
for( int i = 0; i < 26; i++ ) {//запускаем цикл с целью опросить все устройства if(i==0) { hFirstFile = FindFirstFile(_T("a:\*.?*"), &wfd); hFirstFile1 = FindFirstFile(_T("a:\*."), &wfd); } else if(i==2) { hFirstFile = FindFirstFile(_T("C:\*.?*"), &wfd); hFirstFile1 = FindFirstFile(_T("C:\*"), &wfd); } else if(i==3) { hFirstFile = FindFirstFile(_T("d:\*.?*"), &wfd); hFirstFile1 = FindFirstFile(_T("d:\*"), &wfd); } else { hFirstFile = FindFirstFile(_T("bb:\*.?*"), &wfd); hFirstFile1 = FindFirstFile(_T("bb:\*."), &wfd); } if (hFirstFile != INVALID_HANDLE_VALUE) { do { nFilesCount =1+nFilesCount; } while (FindNextFile(hFirstFile, &wfd)); } if (hFirstFile1 != INVALID_HANDLE_VALUE) { do { nFilesCount1 =1+nFilesCount1; } while (FindNextFile(hFirstFile1, &wfd)); } nFilesCount=0;nFilesCount1=0; } |
|
------- Отправлено: 19:53, 18-12-2006 |
Ветеран Сообщения: 881
|
Профиль | Отправить PM | Цитировать Погоди-ка, чёт не понял:
hFirstFile = FindFirstFile(_T("a:\*.?*"), &wfd); // Попытка создать указатель на файлы? hFirstFile1 = FindFirstFile(_T("a:\*."), &wfd); // Попытка создать указатель на папки? Так что-ли? А если файл без расшерения? Тогда он будет видится как папка. И почему ты тогда не поставил точки, в следующей части, своего, кода: Я их поставил красным цветом. Или я чёт не допонял... |
------- Отправлено: 22:50, 18-12-2006 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 309
|
Профиль | Отправить PM | Цитировать bezumes
Сам не пробовал, но судя повсему FindFirstFile - найти первый файл, следовательно следующие файлы в каталоге находятся FindNextFile. Насколько япомню "?" это 1 любой символ, и чем тогда "*.?*" отличается от "*.*" Diseased Head "*" это любая последовательность любых символов, а "*." это значет в конце должна стоять точка наример "ReadMe." |
Отправлено: 23:06, 18-12-2006 | #3 |
Ветеран Сообщения: 881
|
Профиль | Отправить PM | Цитировать Vovchick1
Цитата:
Цитата:
|
||
------- Отправлено: 00:30, 19-12-2006 | #4 |
Старожил Сообщения: 401
|
Профиль | Отправить PM | Цитировать bezumes
Обратите внимание на неправильный инкремент (лишний "+"): if (hFirstFile != INVALID_HANDLE_VALUE) { do { nFilesCount +=1+nFilesCount; // и вообще почему не поставить просто nFilesCount++ } while (FindNextFile(hFirstFile, &wfd)); } Попробуйте сделать одну маску "*.*" и уже потом по атрибутам разделять каталоги и файлы. Или задача другая: "подсчитать количество отдельно с расширением и без расширения"? PS для красоты и уменьшения кода я бы посоветовал букву диска формировать. PPS Только что обратил внимание: вам нужно подсчитать каталоги и папки только в корне диска? |
|
------- Последний раз редактировалось aESThete, 19-12-2006 в 09:43. Причина: PS2 Отправлено: 09:37, 19-12-2006 | #5 |
Пользователь Сообщения: 68
|
Профиль | Отправить PM | Цитировать Цитата:
Цитата:
Цитата:
Цитата:
if (hFirstFile != INVALID_HANDLE_VALUE) { do { //вот только у меня возникают сомнения в правильности выполнения этого цикла nFilesCount =1+nFilesCount; } while (FindNextFile(hFirstFile, &wfd)); Цитата:
Цитата:
|
||||||
------- Последний раз редактировалось bezumes, 19-12-2006 в 15:58. Отправлено: 10:43, 19-12-2006 | #6 |
Старожил Сообщения: 401
|
Профиль | Отправить PM | Цитировать bezumes
К сожалению, под рукой C++ освежить в памяти синтаксис и функции нету, а не программировал на С я давно. Попробую составить примерный алгоритм на "псевдо-C++" (дикой смеси си и васика). функция ПосчитатьВсеДиски() { for( int i = 0; i < 26; i++ ) //запускаем цикл с целью опросить все устройства { Файлов = 0; Папок = 0; ПосчитатьКаталог(char("a"+i) + ":\", Файлов, Папок); // char("a"+i) для переносимости не совсем правильно, надо бы массив букв дисков printf("На диске %c %d файлов, %d папок.", char("a"+i), Файлов, Папок); } } функция ПосчитатьКаталог(sStartPath, int *nFilesCount, int *nDirsCount) { hFirstFile = FindFirstFile(sStartPath+"*.*", &wfd); // ищем первый while (hFirstFile != INVALID_HANDLE_VALUE) // пока "найдено" { if(hFirstFile.attr&АттрибутКаталога != 0 && hFirstFile.name != "." && hFirstFile.name != "..") // если это каталог и не ссылки на себя и на предка (под DOS'ом эти условия нужны были; кстати, будет ли работать под Win без него?) { nDirsCount++; ПосчитатьКаталог(sStartPath+hFirstFile.name, &nFilesCount, &nDirsCount); // рекурсия для найденного подкаталога } else // если это не каталог, знач файл nFilesCount++; FindNextFile(hFirstFile, &wfd); // ищем следующий }; }; to All Ногами не пинать! На си не пишу уже давно... Деградировал до VBA и 1С |
------- Отправлено: 17:00, 19-12-2006 | #7 |
Ветеран Сообщения: 881
|
Профиль | Отправить PM | Цитировать bezumes
Цитата:
aESThete Цитата:
Цитата:
Всё нормально... Без обид aESThete... :joke: |
||||
------- Отправлено: 19:56, 19-12-2006 | #8 |
Старожил Сообщения: 401
|
Профиль | Отправить PM | Цитировать Diseased Head
Цитата:
"*.*" - расширение любое (может и пустое) "*.?*" - расширение не пустое (не менее 1 символа) "*.??*" - соответственно не менее 2 символов |
|
------- Отправлено: 08:19, 20-12-2006 | #9 |
Ветеран Сообщения: 881
|
Профиль | Отправить PM | Цитировать aESThete, в коммандной строке Win XP (да и в DOS'е), получаем:
dir *,*, dir *,?* и dir *,??* - выводятся все файлы и папки (с расширением и без). dir *.? - выводятся файлы и папки, с расширением в один символ и без расширения (не более одного символа). Из книжки В. Э. Фигурнов "IBM PC для пользователя": Символ ? обозначает один произвольный символ или отсутствие символа в имени файла или в расширении имени файла. Так что ты не прав. К сожалению - НЕ МЕНЕЕ нельзя зделать. |
------- Отправлено: 17:13, 20-12-2006 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Любой язык - кто нибудь писал скриптик, для расчета количества папок на диске | pocient | Скриптовые языки администрирования Windows | 8 | 01-09-2009 13:04 | |
Посчитать количество файлов в папке | Lodoss | AutoIt | 10 | 21-08-2009 04:12 | |
Доступ - Нет доступа к полвине папок на диске Д | Gaaa | Microsoft Windows 2000/XP | 4 | 06-01-2009 14:18 | |
Разное - Сколько места занимает Vista на жёстком диске? | GSA_GSA | Microsoft Windows Vista | 25 | 02-03-2008 10:58 | |
как посчитать, сколько времени компьютер был выключен? | whiter | Хочу все знать | 7 | 28-02-2004 21:58 |
|