Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2009, 00:00   #11
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

о, спасибочки, переписал, немнога подправил и работает ))
Olejik вне форума Ответить с цитированием
Старый 20.10.2009, 01:42   #12
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

еще раз привет, вот тут опять непонятки...непонятки так сказать с конвертированием форматов. Я вот хочу узнать дату и время создания файла. Прочитав, нашол функцию ftCreationTime, но в ней класс FILETIME, у которого формат наносекунд и исчисления от 1601 года 1 января, так что выводить эту инфу нет резона, надо ее конвертировать... там еще есть функция GetFileTime, но там тоже указатель на FILETIME, мне надо вывести на экран дату и время последнего изменения...именно как форматировать, форматирова я нашол, но не знаю как все это просто собрать, вот функция которую я нашол:FileTimeToSystemTime
Код:
bool SearchFiles(TCHAR *buffer)
{
	HANDLE hFile;
	WIN32_FIND_DATA findFileData;
	//TCHAR temp[MAX_PATH];
	
	SetCurrentDirectory(buffer);
	
	if((hFile=FindFirstFile(TEXT("*.*"), &findFileData))==INVALID_HANDLE_VALUE)
	{
		printf("Invalid file handle (%d)\n", GetLastError());
		return false;
	}
	else 
	{	
		do
		{
			//if(!strcmp(findFileData.cFileName, TEXT("."))||!strcmp(findFileData.cFileName, TEXT("..")))	
			//{
			//	continue;
			//}
			if(findFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
			{
				printf("<DIR>");
			}
			printf("\t%s\n", findFileData.cFileName);
                                  //вот сюда я хочу засунуть вывод даты и времени последнего изменения файла
		}
		while(FindNextFile(hFile, &findFileData)!=0);
	}
	FindClose(hFile);
	return true;
}
Olejik вне форума Ответить с цитированием
Старый 20.10.2009, 21:13   #13
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

немного поработав над исходником я нашол выход, но косяк в том, что я вывожу время только той папки,в которой нахожусь, а не ее содержимого
Код:
bool SearchFiles(TCHAR *buffer)
{
	int files = 0;
	int folders = 0;
	HANDLE hFile;
	WIN32_FIND_DATA findFileData;
    FILETIME ft;
    SYSTEMTIME st;
	//TCHAR temp[MAX_PATH];
	
	SetCurrentDirectory(buffer);
	
	if((hFile=FindFirstFile(TEXT("*.*"), &findFileData))==INVALID_HANDLE_VALUE)
	{
		printf("Invalid file handle (%d)\n", GetLastError());
		return false;
	}
	else 
	{	
		do
		{
			//if(!strcmp(findFileData.cFileName, TEXT("."))||!strcmp(findFileData.cFileName, TEXT("..")))	
			//{
			//	continue;
			//}
			GetSystemTime(&st);              // gets current time
			SystemTimeToFileTime(&st, &ft);  // converts to file time format
			printf("%d.%d.%d %d:%d:%d\t",st.wDay,st.wMonth,st.wYear,(st.wHour+3),st.wMinute,st.wSecond);
			if(findFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
			{
				printf("<DIR>\t");
				folders++;
			}
			else
				if (!(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
				{
					printf("\t%d",findFileData.nFileSizeLow);
					files++;
				}
				
			printf("\t%s\n", findFileData.cFileName);

		}
		while(FindNextFile(hFile, &findFileData)!=0);
	}
	printf("%d файлов\n%d папок\n", files, folders);
	FindClose(hFile);
	return true;
}
как мне зделать так, чтобы я вычислял время не только этой папки, но и ее содержимого? Я чувствую, что ответ находится в следующем куске:
Код:
			if(findFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
			{				
				strcpy(temp, buffer);
				strcat(buffer, "\\");
				strcat(buffer, findFileData.cFileName);
				
				SearchFiles(buffer);
				strcpy(buffer,temp);
				continue;
			}
но вот как реализовать я не могу догнать
Olejik вне форума Ответить с цитированием
Старый 21.10.2009, 00:24   #14
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

итак, помудрив с программой и покопавшись в msdn, я наткнулся на подсказки и нашол пример, у меня получилось, но немнога недоработано, начнем с начала. Я нашол функцию GetFileTime, но она не работает без CreateFile, сделал, как то выводит, но выводит немного не так, например если дата изменения будет 20.10.2009 23:08, то она выводит:20.10.2009 23:8, а я не могу привести чтобы выводила "08". Второе, надо еще выводить дату изменения директории, как я понял дату изменения директории узнается по вложенным в ней файлам, но не папкам, т.е. мне надо значит сверять файлы и самый ранний файл который был изменен - брать и выводить его дату изменения как дату изменения дирректории, если это так, то как вообще осуществить, я имею в виду в плане сравнения файлов, можно сначало по году отсортировать, потом по месяцу а потом уже и по году, ну а в конце концов и по времени, часы, минуты. Помогите пожалуйста с 2-я проблемами: вывод нормальной даты изменения файла (как в я выше написал) и реализовать вывод дату изменения дирректории, вот код, который я уже построил.
Код:
BOOL GetLastWriteTime(WIN32_FIND_DATA findFileData)//, LPTSTR lpszString, DWORD dwSize)
{
    FILETIME ftCreate, ftAccess, ftWrite;
    SYSTEMTIME stUTC, stLocal;
	HANDLE hFile;
    //открываем файл...CreateFile, иначе ни как не воспользоваться GetFileTime
    hFile = CreateFile(findFileData.cFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
        OPEN_EXISTING, 0, NULL);
	//если не смогли прочитать время, то FALSE..
    if (!GetFileTime(hFile, &ftCreate, &ftAccess, &ftWrite))
	{
		printf("\t\t");
        return FALSE;
	}//иначе...

    // Convert the last-write time to local time.
    FileTimeToSystemTime(&ftWrite, &stUTC);
    SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);
	printf("%d.%d.%d %d:%d\t",stLocal.wDay,stLocal.wMonth,stLocal.wYear,stLocal.wHour,stLocal.wMinute);
	
	return TRUE;
}
на входе - структура как вы видите. Заранее спасибо за уделеное мне время.
Olejik вне форума Ответить с цитированием
Старый 21.10.2009, 02:38   #15
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

на счет самого вывода я разобрался, там всеголишь надо было написать:
Код:
printf("%02d.%02d.%02d %02d:%02d\t",stLocal.wDay,stLocal.wMonth,stLocal.wYear,stLocal.wHour,stLocal.wMinute);
а вот еще с датами директорий еще к сожаленью не разобрался (
Olejik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор всех доступных значений! AquaKlaster Общие вопросы Delphi 40 02.03.2015 12:27
Перечислене всех папок doniyor Помощь студентам 1 06.08.2009 11:16
Реализовать перебор всех возможных IP-адресов (С++) ak74m Помощь студентам 0 09.04.2009 13:59
Перебор всех возможных вариантов [MI_nor] Общие вопросы C/C++ 9 01.04.2009 21:17
перебор всех элементов в TtreeView vitalik007 Общие вопросы Delphi 10 09.04.2008 15:44