WinApi||посчитать сколько файлов и папок на диске

Аватара пользователя
bezumes

WinApi||посчитать сколько файлов и папок на диске

Сообщение bezumes »

Здравствуйте. Подскажите пожалуйста, почему у меня при подсчете кол-ва файлов и папок на диске это количество не соответствует действительности.



Код:

Код: Выделить всё

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;	
}
Аватара пользователя
bezumes

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение bezumes »

Все-равно, даже когда я поставил *.* чтобы все посчитать, он мне как-то неправильно считает. Например в корне диска d у меня на два

меньше чем он считает, а на с всего шесть, а он считает 18.



Код:

Код: Выделить всё

char temp[100];
	for(int i=0;i<26;i++)
	{		
		hFirstFile=0;
		WIN32_FIND_DATA FindFileData;
		HANDLE hf;		
		if(i==2)
		{
		m_info += " В корне диска C ";
		hf=FindFirstFile("c:\\*.*", &FindFileData);
		//hFirstFile++;
		}
		else
		if(i==3)
		{
			m_info += " В корне диска D ";
			hf=FindFirstFile("d:\\*.*", &FindFileData);
			//hFirstFile++;
		}
		else
		{
			hf=FindFirstFile("e:\\*", &FindFileData);
		}
			if (hf!=INVALID_HANDLE_VALUE)
			{
				do
				{					
					hFirstFile++;
				}
				while (FindNextFile(hf,&FindFileData)!=0);
				itoa( (int)hFirstFile, temp, 10 );
				m_info += (CString)&temp[0]; m_info += " Файлов и папок";m_info += "\r\n";
				FindClose(hf);
			}
	}
	UpdateData(false);


Цитата:



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

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

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

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

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



А почему тогда, например в стандартном xp поиске *.* это все файлы *.?* файлы с расширением более 1 символа
Аватара пользователя
Diseased Head

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение Diseased Head »

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



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);
		}

Я их поставил красным цветом. Или я чёт не допонял...
Аватара пользователя
Vovchick1

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение Vovchick1 »

bezumes

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



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



Diseased Head

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

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение Diseased Head »

Vovchick1
Цитата:



и чем тогда "*.?*" отличается от "*.*"



Да я в общем-то к этому и клонил...


Цитата:



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



Мож так: "*" значит все файлы и папки (с расширением и без), а "*." папки без расширения и файлы без расширения. Точнее, в конце должна стоять только точка. А можно и так: "*." - "все символы до точки, включая саму точку".
Аватара пользователя
aESThete

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение aESThete »

bezumes

Обратите внимание на неправильный инкремент (лишний "+"):



Код:

Код: Выделить всё

if (hFirstFile != INVALID_HANDLE_VALUE)
  {
    do
      {
        nFilesCount +=1+nFilesCount; // и вообще почему не поставить просто nFilesCount++
      }
    while (FindNextFile(hFirstFile, &wfd));
  }

И по маскам: я так понял, что у вас hFirstFile для файлов, а hFirstFile1 для каталогов. Каталоги(папки) тоже могут иметь расширение, так и файлы могут быть без расширения.

Попробуйте сделать одну маску "*.*" и уже потом по атрибутам разделять каталоги и файлы.

Или задача другая: "подсчитать количество отдельно с расширением и без расширения"?



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



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

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение bezumes »

Цитата:



и чем тогда "*.?*" отличается от "*.*"



как чем, в первом случае расширение 1 символ а во втором любое количество.


Цитата:



Так что-ли? А если файл без расширения? Тогда он будет видится как папка



А нечего такие файлы на диске держать Изображение


Цитата:



И почему ты тогда не поставил точки, в следующей части, своего, кода



Там я задумывал что найдутся все папки ,неподумал о том что и папки с расширением могут быть, так что А нечего такие папки на диске держать Изображение


Цитата:



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



Ну у меня же



Код:

Код: Выделить всё

 
 if (hFirstFile != INVALID_HANDLE_VALUE)
{
do
{
//вот только у меня возникают сомнения в правильности выполнения этого цикла
nFilesCount =1+nFilesCount;
}
                  while (FindNextFile(hFirstFile, &wfd));

делать пока новые файлы/папки находит.


Цитата:



Или задача другая: "подсчитать количество отдельно с расширением и без расширения"?



Не, нужно подсчитать количество файлов и папок каждом устройстве


Цитата:



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



Вообще-то нет, но я еще не придумал как искать еще и во вложеных папках.
Аватара пользователя
aESThete

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение aESThete »

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С Изображение
Аватара пользователя
Diseased Head

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение Diseased Head »

bezumes


Цитата:




Цитата:



и чем тогда "*.?*" отличается от "*.*"



как чем, в первом случае расширение 1 символ а во втором любое количество.



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



aESThete


Цитата:



Попробую составить примерный алгоритм на "псевдо-C++" (дикой смеси си и васика).



Так этож новый язык - СиВасик (Casic или C от Васи). Изображение


Цитата:



На си не пишу уже давно... Деградировал до VBA и 1С



Деградация это плохо... Изображение

Всё нормально... Без обид aESThete... :joke:
Аватара пользователя
aESThete

Re: WinApi||посчитать сколько файлов и папок на диске

Сообщение aESThete »

Diseased Head


Цитата:



"*.*", "*.?*", "*.??*" и т. д. - дают идентичный результат.



Не совсем относится к теме, но позвольте не согласиться:

"*.*" - расширение любое (может и пустое)

"*.?*" - расширение не пустое (не менее 1 символа)

"*.??*" - соответственно не менее 2 символов
Ответить

Вернуться в «Программирование и базы данных»