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

Компьютерный форум 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

 

Аватара для bezumes

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


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

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


Все-равно, даже когда я поставил *.* чтобы все посчитать, он мне как-то неправильно считает. Например в корне диска 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 символа

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


Отправлено: 12:20, 21-12-2006 | #11



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

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


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

Ветеран


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

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


bezumes
Цитата:
А почему тогда, например в стандартном xp поиске *.* это все файлы *.?* файлы с расширением более 1 символа
Проверил - действительно не более одного символа (я поиском редко пользуюсь). А почему это? Да потому что: программеры в Microsoft напортачили с этим поиском (так как DOS раньше был, и коммандная строка, почему-то, иначе работает). Это, думаю, одна из причин глюков... Или это издёвка над пользователями - что-б жизнь малиной не казалась.

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


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


Аватара для Vovchick1

Старожил


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

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


Цитата:
Все-равно, даже когда я поставил *.* чтобы все посчитать, он мне как-то неправильно считает. Например в корне диска d у меня на два меньше чем он считает, а на с всего шесть, а он считает 18.
1. Может скрытые или системные не отображаются.
2. Может переменную "счётчика" не обнулил до начала циклов, и вней присутствуют левые данные.
Цитата:
Например в корне диска d у меня на два меньше чем он считает
3. Не вкурсе насчёт этих функций, но когда ищеш файлы по маске (стандартными средствами Pascal или VB) обычно первые два "файла": ".."
И "..." (Или что-то в этом роде, уже непомню).

Отправлено: 01:43, 22-12-2006 | #13


Старожил


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

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


Vovchick1
см. мой исходник: (hFirstFile.name != "." && hFirstFile.name != "..")
это ссылки на себя и на предка (но откуда они в корне?!)
прекрасно видно, если смотреть каталог DiskEdit'ом

Diseased Head
Цитата:
программеры в Microsoft напортачили с этим поиском
это точно, с отдельно стоящим(и) "?" глючок-с
для пробы создал
readme.
readme.t
readme.tx
readme.txt
под XP dir *.*, *.?* и т.д. дают одинаковы е результаты
но read?me (файлов не найдено) и read*me (файлы найдены) отрабатывает чётко

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


Отправлено: 08:43, 22-12-2006 | #14


Аватара для Vovchick1

Старожил


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

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


aESThete
Цитата:
см. мой исходник: (hFirstFile.name != "." && hFirstFile.name != "..")
Пардон виноват незаметил!!!
Цитата:
это ссылки на себя и на предка (но откуда они в корне?!)
Насчёт ".." вкурсе, а что за "." незнал, будем знать!!!
Цитата:
прекрасно видно, если смотреть каталог DiskEdit'ом
Это ты про:
Цитата:
Может скрытые или системные не отображаются.
А насчёт:
Цитата:
Может переменную "счётчика" не обнулил до начала циклов, и вней присутствуют левые данные.

Отправлено: 11:00, 22-12-2006 | #15


Аватара для bezumes

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


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

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


Цитата:
Может переменную "счётчика" не обнулил до начала циклов, и вней присутствуют левые данные.
Сам счетчик в начале цикла for обнуляется. возможно надо HANDLE hf обнулить. Я попробЫвал написать hf=INVALID_HANDLE_VALUE; и у меня вообще отрицательные значения получились. хотя если в конце стоит FindClose(hf); то этого не надо делать
Код: Выделить весь код
         CString bukva[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
	char temp[100];	
	for(int i=0;i<26;i++)
	{		
		hFirstFile=0;//обнуляем 
		hFirstFile=0;	// и здесь обнуляем
		WIN32_FIND_DATA lpFindFileData ;
		WIN32_FIND_DATA FindFileData;
		HANDLE hf;	
		hf=INVALID_HANDLE_VALUE;
		hf=FindFirstFile(_T(bukva[i]+":\\*.*"), &FindFileData);
		if (hf!=INVALID_HANDLE_VALUE)
			{
				do
				{hFirstFile=0;hFirstFile=0;
					
					
					if ((FindFileData.dwFileAttributes&&FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY)
					{
						hFirstFile++;
					}
					else
					{
						hFirstFile1++;
					}					
				}
				while (FindNextFile(hf,&FindFileData)!=0);
				m_info += " В корне диска "+_T(bukva[i]+" ");
				itoa( (int)hFirstFile, temp, 10 );
				m_info += (CString)&temp[0]; m_info += "папок";m_info += "\r\n";
				m_info += " В корне диска "+_T(bukva[i]+" ");
				itoa( (int)hFirstFile1, temp, 10 );
				m_info += (CString)&temp[0]; m_info += " файлов";m_info += "\r\n";
				FindClose(hf);
			}
	}
	UpdateData(false);

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


Отправлено: 14:21, 22-12-2006 | #16


Аватара для bezumes

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


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

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


В итоге получилось вот так:только долговато ищет(у меня 14.19 сек, а что будет на более слабых компах ), ну и результаты от стандартного поиска отличаются(но немного)
Код: Выделить весь код
Find(CString(bukva[i])+CString(":"));
Код: Выделить весь код
void CSysInfoDlg::Find(CString szPath)
{
CFileFind F;
CString S=szPath+"\\*.*";
BOOL bFlag=F.FindFile(S);
while(bFlag)
{
bFlag=F.FindNextFile();
if(F.IsDirectory()==TRUE && F.IsDots()==FALSE)
{
	p++;	
Find(F.GetFilePath());
}
else
{
	f++;
}
}
F.Close();
}

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


Отправлено: 12:08, 24-12-2006 | #17



Компьютерный форум 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




 
Переход