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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2011, 21:21   #1
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию FindFirstFile/FindNextFile. Намудрил что-то с адресами при передаче в функцию

Здравствуйте. Есть программа, которая должна сравнивать содержимое указанных каталогов. Написал часть для одного каталога и столкнулся с проблемой.
Файлы задал как структуру - имя, размер, файл или нет.
Чтобы не дублировать код, вынес нахождение содержимого и подсчет файлов и папок в отдельную функцию. Собственно, передаю в нее адрес на массив структур, т.к. не знаю, как его возвращать из функции.
Поскольку с указателями и динамическими массивами дружу не очень, сделал какую-то фигню, и программа выводит, как мне кажется, мусор из кучи, хотя я не совсем понимаю, почему.

Код:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <iomanip>

using namespace std;

struct File {
	char name[256];
	int size;
	bool isFile;
};

WIN32_FIND_DATA FileData;
HANDLE hSearch;

int GetFilesAndFolders (char *argPath, File *file, int *FilesCounter, int *FoldersCounter);

int main ()
{
	int GlobalCounter;
	File* First = new File[100];
	File* Second = new File[100];
	char* FirstFolderPath = new char[MAX_PATH + 4];
	char* SecondFolderPath = new char[MAX_PATH + 4];
	int* FirstFilesCounter = 0, *FirstFoldersCounter = 0,
			*SecondFilesCounter = 0, *SecondFoldersCounter = 0;
	cout << "Input path to the first folder in form of 'X:\\ desiredfolder': ";
	cin >> FirstFolderPath;
	//cout << "Input path to the second folder in form of 'X:\\desiredfolder': ";
//	cin >> SecondFolderPath;
	GlobalCounter = GetFilesAndFolders (FirstFolderPath, First, FirstFilesCounter, FirstFoldersCounter);
	cout << "First folder files and folders " << endl;
	cout << "+======================================+" << endl;
	cout << setw (13) << setiosflags (ios::left) << "|Name" 
		<< setw (13) << setiosflags (ios::left) << "||Size" 
		<< setw (13) << setiosflags (ios::left) 
		<< "||Type" << "|" << endl;
	cout << "|======================================|" << endl;
	for ( int i = 1; i < GlobalCounter; i++)
	cout << "|" << setw (12) << setiosflags (ios::left) << First[i].name << "||" 
	<< setw (11) << setiosflags (ios::left) << First[i].size << "||"
	<< setw (11) << setiosflags (ios::left) << First[i].isFile << "|" << endl;
	cout << "+======================================+" << endl;
	getch ();
	return 0;	
}	

int GetFilesAndFolders (char *argPath, File *file, int *FilesCounter, int *FoldersCounter)
{
	BOOL fFinished = FALSE;
	char* mask = new char[strlen(argPath)+4];
	strcpy (mask, argPath);
	strcat (mask, "\\*.*");
	hSearch = FindFirstFile (mask, &FileData);
	int i = 0;
	while (!fFinished)
	{
		i++;
		if ( (FileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
			&& (FileData.cFileName[0] != '.') )
		{
			char* name = new char[strlen(FileData.cFileName)+2];
			file[i].isFile = FALSE;
			strcpy (name, FileData.cFileName);
			strcpy (file[i].name, name);
			file[i].size = (FileData.nFileSizeHigh * (MAXWORD + 1) ) + FileData.nFileSizeLow;
			FoldersCounter++;
			delete[] name;
		}

		if ( (FileData.cFileName[0] != '.') 
			&& (FileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) )
		{
			char* name = new char[strlen(FileData.cFileName)+2];
			file[i].isFile = TRUE;
			strcpy (name, FileData.cFileName);
			strcpy (file[i].name, name);
			file[i].size = (FileData.nFileSizeHigh * (MAXWORD + 1) ) + FileData.nFileSizeLow;
			FilesCounter++;
			delete[] name;
		}

		

		if (!FindNextFile (hSearch, &FileData) )
		{
			if (GetLastError () == ERROR_NO_MORE_FILES)
			{
				fFinished = TRUE;
			}
		}
	}
	FindClose (hSearch);
	cout << i;
	getch();
	return i;
}
И, кстати, с GlobalCounter-ом всех элементов массива что-то не то. Он выдает значение на 2 больше.
Собственно, вот. Выручайте, в очередной раз
RAZOR1703 вне форума Ответить с цитированием
Старый 05.12.2011, 22:42   #2
RAZOR1703
Пользователь
 
Регистрация: 15.12.2010
Сообщений: 74
По умолчанию

Ну, если я ставлю при выводе в цикле i = 3, и до GlobalCounter+1, то все красивенько. Только теперь вопрос: почему так?
RAZOR1703 вне форума Ответить с цитированием
Старый 06.12.2011, 04:44   #3
zotox
Форумчанин
 
Регистрация: 09.09.2008
Сообщений: 395
По умолчанию

Код:
Код:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <iomanip>

using namespace std;

struct File {
	char name[256];
	int size;
	bool isFile;
};

WIN32_FIND_DATA FileData;
HANDLE hSearch;

int GetFilesAndFolders (char *argPath, File *file, int *FilesCounter, int *FoldersCounter);

int main ()
{
	int GlobalCounter;
	File* First = new File[300];
	File* Second = new File[300];
	char* FirstFolderPath = new char[MAX_PATH + 4];
	char* SecondFolderPath = new char[MAX_PATH + 4];
	int* FirstFilesCounter = new int, *FirstFoldersCounter = new int,
			*SecondFilesCounter = new int, *SecondFoldersCounter = new int;
	*FirstFilesCounter = *FirstFoldersCounter = 0;
	cout << "Input path to the first folder in form of 'X:\\ desiredfolder': ";
	cin >> FirstFolderPath;
	//cout << "Input path to the second folder in form of 'X:\\desiredfolder': ";
//	cin >> SecondFolderPath;
	GlobalCounter = GetFilesAndFolders (FirstFolderPath, First, FirstFilesCounter, FirstFoldersCounter);
	cout << "First folder files and folders " << endl;
	cout << "+======================================+" << endl;
	cout << setw (13) << setiosflags (ios::left) << "|Name" 
		<< setw (13) << setiosflags (ios::left) << "||Size" 
		<< setw (13) << setiosflags (ios::left) 
		<< "||Type" << "|" << endl;
	cout << "|======================================|" << endl;
	for ( int i = 1; i < GlobalCounter + 1; i++)
	cout << "|" << setw (12) << setiosflags (ios::left) << First[i].name << "||" 
	<< setw (11) << setiosflags (ios::left) << First[i].size << "||"
	<< setw (11) << setiosflags (ios::left) << First[i].isFile << "|" << endl;
	cout << "+======================================+" << endl;
	getch ();
	return 0;	
}	

int GetFilesAndFolders (char *argPath, File *file, int *FilesCounter, int *FoldersCounter)
{
	BOOL fFinished = FALSE;
	char* mask = new char[strlen(argPath)+4];
	strcpy (mask, argPath);
	strcat (mask, "\\*.*");
	hSearch = FindFirstFile (mask, &FileData);
	int i = 0;
	while (!fFinished)
	{
		//i++;
		if ( (FileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
			&& (FileData.cFileName[0] != '.') )
		{
			i++;
			static char name[256];
			file[i].isFile = FALSE;
			strcpy (name, FileData.cFileName);
			strcpy (file[i].name, name);
			file[i].size = (FileData.nFileSizeHigh * (MAXWORD + 1) ) + FileData.nFileSizeLow;
			(*FoldersCounter)++;
		}

		if ( (FileData.cFileName[0] != '.') 
			&& (FileData.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY) )
		{
			i++;
			static char name[256];//<- для удобности
			file[i].isFile = TRUE;
			strcpy (name, FileData.cFileName);
			strcpy (file[i].name, name);//ну а вообще можно и с cFileName сразу копировать
			file[i].size = (FileData.nFileSizeHigh * (MAXWORD + 1) ) + FileData.nFileSizeLow;
			(*FilesCounter)++;
		}

		

		if (!FindNextFile (hSearch, &FileData) )
		{
			if (GetLastError () == ERROR_NO_MORE_FILES)
			{
				fFinished = TRUE;
			}
		}
	}
	FindClose (hSearch);
	cout << i;
	getch();
	return i;
}
zotox вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что за искажения происходят при передаче bmp-картинки по TCP? idip Работа с сетью в Delphi 2 07.06.2011 15:07
Ошибка при передаче по ссылке N-Cat Помощь студентам 4 10.05.2011 01:24
Проблема при передаче через Com-порт ShlakBaum Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 01.02.2010 21:59
Что то намудрил .. jewel Общие вопросы C/C++ 5 11.02.2009 13:29
отделение строк при передаче в serversocket... prizrak1390 Общие вопросы Delphi 14 29.06.2008 21:13