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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2014, 05:33   #1
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию Просмотр папок и подпапок с помощью 4 процессов

Здравствуйте. Стоит задача пройтись по папкам с помощью 4 копий одной и той же программы. Пока что результаты прохода пробую писать в разные файлы. Программа падает, помогите пожалуйста понять, в чем дело. В с++ полный новичек, поэтому прошу сильно не бить

Код:
#define _CRT_SECURE_NO_WARNINGS

#define BOOST_FILESYSTEM_VERSION 3

//мои константы
#define BUF_SIZE					8000
#define SHARED_MEMORY_BLOCK_NAME	"Directory_list"

#include "MemoryManager.h"
#include <fstream>

namespace fs = boost::filesystem;

int main(int argc, char* argv[])
{
	fs::path p/*(fs::current_path())*/;

	//если основной процесс
	if (argc > 1)
	{
		char programName[] = "C:\\Users\\Phanthom\\Documents\\Visual Studio 2012\\Projects\\try349\\Debug\\try349.exe";

		HANDLE secondProcess;
		HANDLE thirdProcess;
		HANDLE fourthProcess;

		std::string firstPath = argv[1];// + '\n';
		firstPath += '\n';
		if(!CreateNewProcess(secondProcess, 2, programName))
		{
			std::cout << "Error creating process 2" << std::endl;
		}
		if(!CreateNewProcess(thirdProcess, 4, programName))
		{
			std::cout << "Error creating process 3" << std::endl;
		}
		if(!CreateNewProcess(fourthProcess, 8, programName))
		{
			std::cout << "Error creating process 4" << std::endl;
		}
		hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, SHARED_MEMORY_BLOCK_NAME);
		mutex = CreateMutex(NULL, true, "MyMutex");
		WaitForSingleObject(mutex, INFINITE);
		if (hMapFile != INVALID_HANDLE_VALUE)
		{
			void* buf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
			if (buf)
			{
				strcpy((char*)buf, firstPath.c_str());
				UnmapViewOfFile(buf);
			}
		}
		ReleaseMutex(mutex);
		Sleep(500);
	}
	
	hMapFile = OpenFileMapping( FILE_MAP_ALL_ACCESS, FALSE, SHARED_MEMORY_BLOCK_NAME);
	mutex = OpenMutex(SYNCHRONIZE, false, "MyMutex");
	std::ofstream F;
	if (!fs::exists("C:\\1.txt"))
	{
		F.open("C:\\1.txt");
	}
	else if (!fs::exists("C:\\2.txt"))
	{
		F.open("C:\\2.txt");
	}
	else if (!fs::exists("C:\\3.txt"))
	{
		F.open("C:\\3.txt");
	}
	else if (!fs::exists("C:\\4.txt"))
	{
		F.open("C:\\4.txt");
	}

	CMemoryManager MyManager(hMapFile);

	while(true)
	{
		std::string currentPath;
		WaitForSingleObject(mutex, INFINITE);
		currentPath = MyManager.ReadFromMemory();
		ReleaseMutex(mutex);
		if(currentPath.empty())
		{
			Sleep(1000);
			WaitForSingleObject(mutex, INFINITE);
			currentPath = MyManager.ReadFromMemory();
			ReleaseMutex(mutex);
			if(currentPath.empty())
			{
				break;
			}
		}	
		p = fs::system_complete(TrimEnd(currentPath));
		WaitForSingleObject(mutex, INFINITE);
		if(!MyManager.WriteInMemory(TrimBegin(currentPath)))
		{
			F << "Error on writing" << std::endl;
		}
		ReleaseMutex(mutex);
		if (!fs::exists(p))
		{
			WaitForSingleObject(mutex, INFINITE);
			F << "\nNot found: " << p << std::endl;
			ReleaseMutex(mutex);
		}
		if (fs::is_directory(p))
		{
			ParseDirectory(p, MyManager, F, argc);
		}
	}
	F.close();
	CloseHandle(hMapFile);
	return 0;
}

void ParseDirectory(fs::path p, CMemoryManager &manager, std::ofstream &f, int argc)
{
	fs::directory_iterator end_iter;
	for (fs::directory_iterator dir_itr(p);
		dir_itr != end_iter;
		++dir_itr)
	{
		try
		{
			if (fs::is_directory(dir_itr->status()))
			{
				WaitForSingleObject(mutex, INFINITE);
				std::string temp = manager.ReadFromMemory();
				ReleaseMutex(mutex);
				temp += '\n';
				temp += dir_itr->path().string();
				WaitForSingleObject(mutex, INFINITE);
				if(!manager.WriteInMemory(temp))
				{
					f << "Error on writting" << std::endl;
				}
				ReleaseMutex(mutex);
			}
			else if (fs::is_regular_file(dir_itr->status()))
			{
				if(argc > 1)
				{
					f << dir_itr->path().filename() << "\n";
				}
				else
				{
					f << dir_itr->path().filename() << "LOOOOL" << "\n";
				}
			}
			else
			{
				f << dir_itr->path().filename() << " [other]\n";
			}
		}
		catch (const std::exception & ex)
		{
			f << dir_itr->path().filename() << " " << ex.what() << std::endl;
		}
	}
}

std::string TrimEnd(std::string const& s)
{
	size_t pos = s.find_first_of('\n');
	return
		(pos == std::string::npos)
		? s
		: s.substr(0, pos);
}

std::string TrimBegin(std::string const& s)
{
	size_t pos = s.find_first_of('\n');
	return
		(pos == std::string::npos)
		? ""
		: s.substr(pos+1, s.length());
}

bool CreateNewProcess(HANDLE &hProcess, int mask, char* s)
{
	STARTUPINFO si; 
	PROCESS_INFORMATION pi;

	ZeroMemory(&si, sizeof(STARTUPINFO)); 
	si.cb = sizeof(STARTUPINFO);

	if (!CreateProcess(NULL, s, NULL, NULL, FALSE, 
	NULL, NULL, NULL, &si, &pi))
	{
		std::cout << "The new process is not created. " << std::endl;
		return false;
	}
	hProcess = pi.hProcess;
	SetProcessAffinityMask(hProcess, mask);
	return true;
}
Yoh вне форума Ответить с цитированием
Старый 29.01.2014, 05:40   #2
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

Извините вырезал некоторые объявления.
Код:
//мои константы
#define BUF_SIZE					8000
#define SHARED_MEMORY_BLOCK_NAME	"Directory_list"


#include "boost/filesystem/operations.hpp"
#include "boost/filesystem/path.hpp"
#include "boost/progress.hpp"
#include "windows.h"
#include "MemoryManager.h"
#include <fstream>
#include <iostream>

namespace fs = boost::filesystem;

std::string TrimEnd(std::string const& s);
std::string TrimBegin(std::string const& s);
void ParseDirectory(fs::path p, CMemoryManager &manager, std::ofstream &f, int argc);
bool CreateNewProcess(HANDLE &hProcess, int mask, char* s);
HANDLE hMapFile;
HANDLE mutex;
Yoh вне форума Ответить с цитированием
Старый 29.01.2014, 05:57   #3
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

Сам разобрался. Оказывается, ошибка была в самом поиске имен. Программа падала при файлах и папках с пробелами в именах. Буду решать проблему. Извините за беспокойство
Yoh вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Просмотр папок и подпапок с помощью процессов Yoh Помощь студентам 0 13.01.2014 10:22
Сканирование папок и подпапок Hellgate Помощь студентам 2 25.09.2011 22:31
Скрытие программно процессов/папок Lorden Общие вопросы Delphi 0 09.11.2010 14:30
Просмотр процессов Sparky Общие вопросы C/C++ 20 29.08.2010 20:05
Просмотр данных с помощью VBA Lyubov1990 Microsoft Office Excel 0 10.06.2009 16:13