Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » WinApi||посчитать сколько файлов и папок на диске

Ответить
Настройки темы
WinApi||посчитать сколько файлов и папок на диске

Аватара для bezumes

Пользователь


Сообщения: 68
Благодарности: 1

Профиль | Отправить PM | Цитировать


Изменения
Автор: bezumes
Дата: 19-12-2006
Здравствуйте. Подскажите пожалуйста, почему у меня при подсчете кол-ва файлов и папок на диске это количество не соответствует действительности.
Код: Выделить весь код
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

 

Аватара для Diseased Head

Ветеран


Сообщения: 881
Благодарности: 55

Профиль | Отправить PM | Цитировать


Погоди-ка, чёт не понял:

hFirstFile = FindFirstFile(_T("a:\*.?*"), &wfd); // Попытка создать указатель на файлы?

hFirstFile1 = FindFirstFile(_T("a:\*."), &wfd); // Попытка создать указатель на папки?

Так что-ли? А если файл без расшерения? Тогда он будет видится как папка. И почему ты тогда не поставил точки, в следующей части, своего, кода:
Код: Выделить весь код
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);
		}
Я их поставил красным цветом. Или я чёт не допонял...

-------
Знаю точно, что я есть. Остальное, всё, не точно.
Возможное - невозможно! Но невозможное - возможно, но нужна жертва соразмерная.


Отправлено: 22:50, 18-12-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Vovchick1

Старожил


Сообщения: 309
Благодарности: 38

Профиль | Отправить PM | Цитировать


bezumes
Сам не пробовал, но судя повсему FindFirstFile - найти первый файл, следовательно следующие файлы в каталоге находятся FindNextFile.

Насколько япомню "?" это 1 любой символ, и чем тогда "*.?*" отличается от "*.*"

Diseased Head
"*" это любая последовательность любых символов, а "*." это значет в конце должна стоять точка наример "ReadMe."

Отправлено: 23:06, 18-12-2006 | #3


Аватара для Diseased Head

Ветеран


Сообщения: 881
Благодарности: 55

Профиль | Отправить PM | Цитировать


Vovchick1
Цитата:
и чем тогда "*.?*" отличается от "*.*"
Да я в общем-то к этому и клонил...
Цитата:
"*" это любая последовательность любых символов, а "*." это значет в конце должна стоять точка наример "ReadMe."
Мож так: "*" значит все файлы и папки (с расширением и без), а "*." папки без расширения и файлы без расширения. Точнее, в конце должна стоять только точка. А можно и так: "*." - "все символы до точки, включая саму точку".

-------
Знаю точно, что я есть. Остальное, всё, не точно.
Возможное - невозможно! Но невозможное - возможно, но нужна жертва соразмерная.


Отправлено: 00:30, 19-12-2006 | #4


Старожил


Сообщения: 401
Благодарности: 10

Профиль | Отправить PM | Цитировать


bezumes
Обратите внимание на неправильный инкремент (лишний "+"):
Код: Выделить весь код
if (hFirstFile != INVALID_HANDLE_VALUE)
  {
    do
      {
        nFilesCount +=1+nFilesCount; // и вообще почему не поставить просто nFilesCount++
      }
    while (FindNextFile(hFirstFile, &wfd));
  }
И по маскам: я так понял, что у вас hFirstFile для файлов, а hFirstFile1 для каталогов. Каталоги(папки) тоже могут иметь расширение, так и файлы могут быть без расширения.
Попробуйте сделать одну маску "*.*" и уже потом по атрибутам разделять каталоги и файлы.
Или задача другая: "подсчитать количество отдельно с расширением и без расширения"?

PS для красоты и уменьшения кода я бы посоветовал букву диска формировать.

PPS Только что обратил внимание: вам нужно подсчитать каталоги и папки только в корне диска?

-------
Успехов.


Последний раз редактировалось aESThete, 19-12-2006 в 09:43. Причина: PS2


Отправлено: 09:37, 19-12-2006 | #5


Аватара для bezumes

Пользователь


Сообщения: 68
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата:
и чем тогда "*.?*" отличается от "*.*"
как чем, в первом случае расширение 1 символ а во втором любое количество.
Цитата:
Так что-ли? А если файл без расширения? Тогда он будет видится как папка
А нечего такие файлы на диске держать
Цитата:
И почему ты тогда не поставил точки, в следующей части, своего, кода
Там я задумывал что найдутся все папки ,неподумал о том что и папки с расширением могут быть, так что А нечего такие папки на диске держать
Цитата:
Сам не пробовал, но судя повсему FindFirstFile - найти первый файл, следовательно следующие файлы в каталоге находятся FindNextFile.
Ну у меня же
Код: Выделить весь код
 
 if (hFirstFile != INVALID_HANDLE_VALUE)
{
do
{
//вот только у меня возникают сомнения в правильности выполнения этого цикла
nFilesCount =1+nFilesCount;
}
                  while (FindNextFile(hFirstFile, &wfd));
делать пока новые файлы/папки находит.
Цитата:
Или задача другая: "подсчитать количество отдельно с расширением и без расширения"?
Не, нужно подсчитать количество файлов и папок каждом устройстве
Цитата:
PPS Только что обратил внимание: вам нужно подсчитать каталоги и папки только в корне диска?
Вообще-то нет, но я еще не придумал как искать еще и во вложеных папках.

-------
Ты говоришь я Демон, так и есть.
Со мною не видать тебе удачи.
Навеки моё дело зло и месть.
Для демона не может быть иначе.(с) КиШ


Последний раз редактировалось bezumes, 19-12-2006 в 15:58.


Отправлено: 10:43, 19-12-2006 | #6


Старожил


Сообщения: 401
Благодарности: 10

Профиль | Отправить 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


Аватара для Diseased Head

Ветеран


Сообщения: 881
Благодарности: 55

Профиль | Отправить PM | Цитировать


bezumes
Цитата:
Цитата:
и чем тогда "*.?*" отличается от "*.*"
как чем, в первом случае расширение 1 символ а во втором любое количество.
Один символ, это когда - "*.?". А маски: "*.*", "*.?*", "*.??*" и т. д. - дают идентичный результат.

aESThete
Цитата:
Попробую составить примерный алгоритм на "псевдо-C++" (дикой смеси си и васика).
Так этож новый язык - СиВасик (Casic или C от Васи).
Цитата:
На си не пишу уже давно... Деградировал до VBA и 1С
Деградация это плохо...
Всё нормально... Без обид aESThete... :joke:

-------
Знаю точно, что я есть. Остальное, всё, не точно.
Возможное - невозможно! Но невозможное - возможно, но нужна жертва соразмерная.


Отправлено: 19:56, 19-12-2006 | #8


Старожил


Сообщения: 401
Благодарности: 10

Профиль | Отправить PM | Цитировать


Diseased Head
Цитата:
"*.*", "*.?*", "*.??*" и т. д. - дают идентичный результат.
Не совсем относится к теме, но позвольте не согласиться:
"*.*" - расширение любое (может и пустое)
"*.?*" - расширение не пустое (не менее 1 символа)
"*.??*" - соответственно не менее 2 символов

-------
Успехов.


Отправлено: 08:19, 20-12-2006 | #9


Аватара для Diseased Head

Ветеран


Сообщения: 881
Благодарности: 55

Профиль | Отправить PM | Цитировать


aESThete, в коммандной строке Win XP (да и в DOS'е), получаем:

dir *,*, dir *,?* и dir *,??* - выводятся все файлы и папки (с расширением и без).
dir *.? - выводятся файлы и папки, с расширением в один символ и без расширения (не более одного символа).

Из книжки В. Э. Фигурнов "IBM PC для пользователя": Символ ? обозначает один произвольный символ или отсутствие символа в имени файла или в расширении имени файла.

Так что ты не прав. К сожалению - НЕ МЕНЕЕ нельзя зделать.

-------
Знаю точно, что я есть. Остальное, всё, не точно.
Возможное - невозможно! Но невозможное - возможно, но нужна жертва соразмерная.


Отправлено: 17:13, 20-12-2006 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » WinApi||посчитать сколько файлов и папок на диске

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - кто нибудь писал скриптик, для расчета количества папок на диске 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




 
Переход