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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 05.02.2008, 23:46   #1
Horror
Пользователь
 
Регистрация: 02.02.2008
Сообщений: 25
По умолчанию Cравнение файлов

Всем привет

в MFC есть ткой компонент
CFileFind
вообщем с его помощью можно узнать информацию о файле
(имя,путь,дата создания,дата изменнения...)
но я не нашел как узнать размер файла?
кнонибудь знает?

собственно к делу
надо сравнить два файла к примеру
первый C:\File\MyOwnFile1.xz
и D:\MyOwnFile1.xz

если они одинаковы то вернем 1 елзе 0

значит идея такая сравнимаем все данные
(время создания ,изменения и размер)
если одинаковые
то файл кторый D:\MyOwnFile1.xz
копируем вместо C:\File\MyOwnFile1.xz


буду очень благодарен если поможите кодом)
а так и советом хватит)
Horror вне форума
Старый 06.02.2008, 00:28   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

В MFC нет компонентов, там только классы. Размер файла дает метод CFileFind::GetLength (в старых версиях был еще CFileFind::GetLength64, теперь он не нужен)

http://msdn2.microsoft.com/en-us/lib...8VS.80%29.aspx
примеры есть по ссылке
B_N вне форума
Старый 06.02.2008, 01:49   #3
Horror
Пользователь
 
Регистрация: 02.02.2008
Сообщений: 25
По умолчанию

Угу я так и думал но ГетЛенгс у меня компилируеться а при запуске дает ошибку
хз почему (

fprintf(fp,"\tLength\t%s\n",(LPCTST R) iFile->GetLength());

ошибка такая:
Unhandled exception at 0x102141eb (msvcr70d.dll) in cs.exe: 0xC0000005: Access violation reading location 0x00000136.

а все другие функции работают(

может не та к юзаю?
Horror вне форума
Старый 06.02.2008, 02:22   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Horror Посмотреть сообщение

может не та к юзаю?
Практически наверняка iFile какого типа? зачем всё это ее приводить LPCTSTR, если проще написать fprintf(fp,"\tLength\t%d\n"....... Размер файла наверняка 0x00000136 (310) байт - после вриведения к указателю это попадает в область NULL-пойнтеров - нижние 64 килобайта, отсюда и результата нет, и access violation. Кстати, fprintf тоже есть "двойного назначения" (коли там LPCTSTR) - _ftprintf (и второй аргумент должен быть дан как _T("\tLength\t%d\n"), не стоит смешивать в одном вызове char, wchar и TCHAR.
B_N вне форума
Старый 06.02.2008, 19:36   #5
Horror
Пользователь
 
Регистрация: 02.02.2008
Сообщений: 25
По умолчанию

спасибо огромное!
при такой записи все работает:
fprintf(fp,"\tLength\t%d\n", iFile->GetLength());
__________________________________
тип такой
CFileFind *iFile;
iFile=new CFileFind();
__________________________________
еще вопросик
какой параметр у методов работающие с временим
типо
GetCreationTime (xz)
GetLastAccessTime(xz)
GetLastWriteTime(xz)

и хотелосьбы узнать что знасит _T(стринг)
это перевод в чар? или что?
Horror вне форума
Старый 06.02.2008, 20:30   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Horror Посмотреть сообщение
тип такой
CFileFind *iFile;
iFile=new CFileFind();
Это был вопрос для того, чтобы Вы сами разобрались куда какой тип С позволяет очень легко орудовать типами, что с непривычки может завести очень далеко.

Цитата:
Сообщение от Horror Посмотреть сообщение
какой параметр у методов работающие с временим
типо
GetCreationTime (xz)
GetLastAccessTime(xz)
GetLastWriteTime(xz)
У них у всех по два прототипа, можно передавать указатель на структуру FILETIME, можно указатель на объект CTime. В любом случае они заполняют указанную переменную требуемым временем.
Код:
virtual BOOL GetLastWriteTime(FILETIME* pTimeStamp) const;
или
Код:
virtual BOOL GetLastWriteTime(CTime& refTime) const;
http://msdn2.microsoft.com/en-us/lib...sh(VS.80).aspx

Цитата:
Сообщение от Horror Посмотреть сообщение
и хотелосьбы узнать что знасит _T(стринг)
это перевод в чар? или что?
Такая и похожие вещи используются повсеместно применительно к строкам и функциям, прямо или косвенно с ними работающим, для облегчения компиляции ANSI или Unicode - версий приложений. Например таких функций, как SetWindowText или SendMessage в Windows нет вообще с незапамятных времён. Вместо этого есть конструкции вот такого плана:

Код:
WINUSERAPI LRESULT WINAPI SendMessageA(IN HWND hWnd, IN UINT Msg, IN WPARAM wParam, IN LPARAM lParam);
WINUSERAPI LRESULT WINAPI SendMessageW(IN HWND hWnd, IN UINT Msg, IN WPARAM wParam, IN LPARAM lParam);

WINUSERAPI BOOL WINAPI SetWindowTextA(IN HWND hWnd, IN LPCSTR lpString); 
WINUSERAPI BOOL WINAPI SetWindowTextW(IN HWND hWnd, IN LPCWSTR lpString);

#ifdef UNICODE
	#define SendMessage  	SendMessageW
	#define SetWindowText  SetWindowTextW
#else
	#define SendMessage  	SendMessageA
	#define SetWindowText  SetWindowTextA
#endif // !UNICODE
(посмотрите, например, заголовки winuser.h или tchar.h)

То есть все анси-функции заменить на юникод-аналоги можно заменить всего лишь определив символ UNICODE. Такая же ситуация со строками - макрос _T(x) (он же _TEXT(x) ) заменяет написанные "человеческим" языком строки либо на (аналогичные) ANSI, либо на двухбайтовые UNICODE еще до компиляции. Точно такая же история и со стандартными функциями, вроде fprintf.

Последний раз редактировалось B_N; 06.02.2008 в 20:45.
B_N вне форума
Старый 06.02.2008, 20:43   #7
Horror
Пользователь
 
Регистрация: 02.02.2008
Сообщений: 25
По умолчанию

большое спасибо за разъяснения!

вот моя функция сравнения файлов!
Код:
//Функция сравнение файлов
int fileEquality( CFtpFileFind *iFtpFile,  CFileFind *iLocalFile)
{

BOOL h1 = iFtpFile->FindFile(_T("*.*")); 
BOOL h2 = iLocalFile->FindFile(_T("*.*")); 
	 while(h1) 
		   { 
				h1 = iFtpFile->FindNextFile();
				 while(h2) 
					{ 
						 
						h2 = iLocalFile->FindNextFile(); 
						if (iFtpFile->GetFileName()==iLocalFile->GetFileName())
								{
									if (iFtpFile->GetLength()!=iLocalFile->GetLength())
									{
										printf("Different files: %s \n", iFtpFile->GetFileName());
									}	
									else
									{
										printf("Files identical: %s \n", iFtpFile->GetFileName());
									}
								
								
								}	
								
					
					}
		   } 

return 1;
}
но почемуто находит только один файл
а у меня их много (спечиально насоздовал)
где проблема в алгоритме?
Horror вне форума
Старый 06.02.2008, 23:26   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Не работает потому, что Вы пытаетесь вкруговую проходить подкаталог, уже однажды целиком пройденный, не начиная поиск заново. Вот так исправьте: (5-я и 9-я строки
Код:
//Функция сравнение файлов
int fileEquality( CFtpFileFind *iFtpFile,  CFileFind *iLocalFile)
{
	BOOL h1 = iFtpFile->FindFile(_T("*.*")); 
	BOOL h2; //= iLocalFile->FindFile(_T("*.*")); 
	while(h1) 
	{ 
		h1 = iFtpFile->FindNextFile();
		h2 = iLocalFile->FindFile(_T("*.*")); //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		while(h2) 
		{ 
			h2 = iLocalFile->FindNextFile(); 
			if (iFtpFile->GetFileName()==iLocalFile->GetFileName())
			{
				if(iFtpFile->GetLength()!=iLocalFile->GetLength())
				{
					printf("Different files: %s \n", iFtpFile->GetFileName());
				}	
				else
				{
					printf("Files identical: %s \n", iFtpFile->GetFileName());
				}
			}	
		}
	} 
    return 1;
}
И, кстати, раз уж Вы взялись местами через _T строки определять, про printf ( _tprintf ) не забывайте.
B_N вне форума
Старый 07.02.2008, 00:11   #9
Horror
Пользователь
 
Регистрация: 02.02.2008
Сообщений: 25
По умолчанию

Еще раз спаибо!

Извени что мучаю)
а как задать так чтобы принимались в расчет только файлы
исключая папки
(т.е. если у нас для всех файлов так: "*.*")
то для только файлов?

мне еще предстоит дорабоать алгоритм чтоб
он еще думал над вложеными папками
(и у папак еще о вложеных папках\файлов)
вот как то так)

это как решить через рекурсию?
буду пытаться...

Последний раз редактировалось Horror; 07.02.2008 в 00:17.
Horror вне форума
Старый 07.02.2008, 01:48   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Horror Посмотреть сообщение
а как задать так чтобы принимались в расчет только файлы
исключая папки?
Проверять CFileFind::IsDirectory или CFileFind::MatchesMask


Цитата:
Сообщение от Horror Посмотреть сообщение
это как решить через рекурсию?
Естественно.
B_N вне форума
Закрытая тема


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна помощь: выбор файлов исходя из имени файлов Antik163RUS Помощь студентам 4 19.06.2008 21:20
Печать pdf файлов из списка файлов в Excel АПС Microsoft Office Excel 5 15.04.2008 16:04
Поиск файлов student_63 Общие вопросы Delphi 6 07.03.2008 19:00
Копирование файлов на FTP Dj_smart Общие вопросы Delphi 2 05.03.2008 09:04
Открытие файлов *.txt Bill Gates Общие вопросы Delphi 3 28.11.2007 22:44